【问题标题】:Creating .so file using ctypes when opencv is included in C++ code当 C++ 代码中包含 opencv 时,使用 ctypes 创建 .so 文件
【发布时间】:2018-10-30 05:20:11
【问题描述】:

我正在尝试创建一个包含 main() 和另一个 C++ 文件(比如 abc.h)的 c++ 文件(twocams.cpp)的 .so 文件。 abc.c 包括 opencv。在使用 ctypes 创建对象时,

 g++ -fPIC -shared twocams.cpp -o twocams.so
 Test = ctypes.cdll.LoadLibrary('/home/administrator/Desktop/project/twocams/twocams.so')

我收到以下错误:- 未定义符号:_ZN2cv12VideoCapturersERNS_3MatE

如何解决这个问题?我想在 python 中使用 c++ 代码。任何替代方案都是可以接受的。

【问题讨论】:

  • 你必须链接opencv
  • 你能指导我怎么做吗?谢谢。

标签: python c++ opencv python-extensions .so


【解决方案1】:

当您创建一个共享对象并想要使用它时,您必须将您的工件链接到该共享对象的所有依赖项。例如。我创建了一个libtwocams.so

#include <opencv2/videoio.hpp>

void test() {
    cv::VideoCapture v;
    cv::Mat m;
    v >> m;
}

要使用这个共享对象,我必须链接 libopencv_core、libopencv_videoio、libopencv_imgproc、libopencv_imgcodecs、libz 等等。我用

编译我的程序
g++ main.cpp -o main -ltwocams -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lz -lwebp -lpthread -ltiff -lpng

另一种解决方案是将共享对象链接到依赖库。例如。

g++ -fPIC -shared twocams.cpp -o -ltwocams -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lz -lwebp -lpthread -ltiff -lpng

创建一个共享库,使加载程序加载所有依赖项。您可以使用ldd 检查依赖关系。

库的顺序很重要。如果 libA 依赖于 libB,那么您必须先链接 libA,然后再链接 libB。

如果你使用 opencv 的共享库,那么你不需要链接所有其他依赖项。

这是一步一步的手册:

安装conan

安装cmake

将存储库 bincrafters 添加到柯南

conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan

创建:

  • conanfile.txt
  • CMakeLists.txt
  • src/twocams.cpp
  • 构建/

conanfile.txt:

[requires]
opencv/3.4.2@bincrafters/stable

[generators]
cmake

[options]
opencv:shared=True

CMakeLists.txt:

cmake_minimum_required(VERSION 3.12)
project(twocams)

include(${CMAKE_BINARY_DIR}/conanbuildinfo.cmake)
conan_basic_setup()

add_library(twocams SHARED src/twocams.cpp src/twocams.h)
target_link_libraries(twocams ${CONAN_LIBS})

转到build 并安装依赖项:

cd build
conan install .. --build missing

使用 cmake 构建项目:

cmake ..
cmake --build .

【讨论】:

  • 感谢@thomas,但问题是我知道如何使用 .so 文件并从中创建共享对象(将其与 pyhton 等其他语言一起使用)但我不知道如何使用共享库.如果你能告诉我如何创建一个.so文件会更好。
  • 在运行您建议的命令时,我也收到错误消息“找不到 -lwebp”。你能说出需要做什么吗?
  • 如果您的链接器找不到 libwebp,您必须安装它。你是如何安装opencv的?是否将静态或动态链接到 opencv?
  • 感谢您的帮助。你能告诉我是否可以将共享库用作 .so 文件还是不同?我实际上需要一个 .so 文件来创建一个 python 对象。
  • 一个 .so 文件是一个共享库,也就是共享对象
【解决方案2】:

我遇到了类似的问题,给我一个

OSError: /lib64/libarmadillo.so.9: undefined symbol: H5Ovisit

在python中,调用时

libCustCv = ctypes.cdll.LoadLibrary('./../so/opencv_cust.so')

为了解决这个问题,我做了以下事情:

  1. 在 cpp 文件中,我将一般导入 #include &lt;opencv2/opencv.hpp&gt; 替换为特定的:#include &lt;opencv2/core/core.hpp&gt;#include &lt;opencv2/imgproc/imgproc.hpp&gt;
  2. 我没有将pkg-config --libs --cflags opencv 的bash 输出作为编译命令的参数(给出了相当多的列表),而是使用了特定的标志: g++ -fPIC -shared -I/usr/include/opencv4 -lopencv_imgproc -lopencv_core -Wall -Wl,-soname,opencv_cust.so -o opencv_cust.so opencv_cust.cpp

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-27
    • 2013-10-11
    • 1970-01-01
    相关资源
    最近更新 更多