当C ++代码中包含opencv时,使用ctypes创建.so文件

时间:2018-10-30 05:20:12

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

我正在尝试创建一个c ++文件(twocams.cpp)的.so文件,其中包括main()和另一个C ++文件(例如abc.h)。 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 ++代码。任何其他选择都是可以接受的。

2 个答案:

答案 0 :(得分:0)

创建共享对象并要使用它时,必须将工件链接到该共享对象的所有依赖项。例如。我创建的|

libtwocams.so

要使用此共享库,我必须链接libopencv_core,libopencv_videoio,libopencv_imgproc,libopencv_imgcodecs,libz等。我用

编译程序
#include <opencv2/videoio.hpp>

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

另一种解决方案是将共享库链接到从属库。例如。

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 检查依赖性。

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

如果您使用opencv的共享库,则无需链接所有其他依赖项。

这是分步指南:

安装conan

安装cmake

将存储库bincrafters添加到柯南

ldd

创建:

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

conanfile.txt:

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

CMakeLists.txt:

[requires]
opencv/3.4.2@bincrafters/stable

[generators]
cmake

[options]
opencv:shared=True

转到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

使用cmake构建项目:

cd build
conan install .. --build missing

答案 1 :(得分:0)

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

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

在python中,调用时

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

要解决此问题,我做了以下事情:

  1. 在cpp文件中,我将常规导入#include <opencv2/opencv.hpp>替换为特定的导入文件:#include <opencv2/core/core.hpp>#include <opencv2/imgproc/imgproc.hpp>
  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