在C++代码中包含opencv时,使用ctypes创建.so文件
Creating .so file using ctypes when opencv is included in C++ code
我正在尝试创建一个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++代码。任何替代方案都是可以接受的。
当您创建一个共享对象并想要使用它时,您必须根据该共享对象的所有依赖项链接您的工件。例如,我创建的libtwocams.so
#include <opencv2/videoio.hpp>
void test() {
cv::VideoCapture v;
cv::Mat m;
v >> m;
}
要使用这个共享对象,我必须链接到libopencv_core、libopencv_videio、libopenc_imgproc、libopenv_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
将存储库bincrafter添加到conan
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 .
我遇到了类似的问题,给了我一个
OSError: /lib64/libarmadillo.so.9: undefined symbol: H5Ovisit
在python中,调用时
libCustCv = ctypes.cdll.LoadLibrary('./../so/opencv_cust.so')
为了解决这个问题,我做了以下操作:
- 在cpp文件中,我用特定的
#include <opencv2/core/core.hpp>
和#include <opencv2/imgproc/imgproc.hpp>
替换了常规导入#include <opencv2/opencv.hpp>
- 我没有将
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
相关文章:
- 在C++代码中包含opencv时,使用ctypes创建.so文件
- 将 ctypes 与 tesserac-ocr 一起使用的例外 TessPageIteratorBoundingBox.
- 如何使用 ctypes 停止和重新启动从 Python 运行的C++代码
- 无法使用 python ctypes 加载C++共享库
- 使用 ctypes 时如何替换 libm?
- 使用 Ctypes 调用复杂的 c++ 代码
- 如何使用 CTypes 将 wchar_t** - 以空结尾的 UNICODE 字符串数组 - 返回到 Python 脚
- 为什么在 2019 年我们仍然不能使用 ctypes 从 Python 调用C++?
- 调用c++库时,如何在Python中使用ctypes传递字节作为引用
- 使用 ctypes 在 Python 中解码 C const char*
- 如何使用 ctypes 将 numpy ndarray 传递给 c++ 函数?
- 使用 ctypes 从函数返回字符串C++会给出大的 int,而不是 char 指针
- 使用 ctypes 和 wchar_t 时如何从 C++ 获取字符串到 python?
- Windows错误:异常:使用从C++到Python的ctypes创建DLL时出现访问冲突或Windows错误193
- C++ python 中的函数来自使用 ctypes 的.dll - 找不到函数和访问冲突
- 如何使用ctypes将类对象从c ++(DllExport)返回到python,反之亦然
- 通过使用CTYPES通过引用传递整数数组
- 使用CTYPES将字符串从Python传递到C - 仅发送第一个字符
- 使用 Python 的 ctypes 调用涉及自定义类型的函数
- 使用 ctypes 将 python dict 转换为结构