当 C++ 代码中包含 opencv 时使用 ctypes 创建 .so 文件
Creating .so file using ctypes when opencv is included in C++ code
我正在尝试创建一个包含 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++ 代码。任何替代方案都是可以接受的。
当您创建一个共享对象并想要使用它时,您必须 link 您的工件针对此共享对象的所有依赖项。例如。我创建了 libtwocams.so
的
#include <opencv2/videoio.hpp>
void test() {
cv::VideoCapture v;
cv::Mat m;
v >> m;
}
要使用此共享对象,我必须 link 反对 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
另一种解决方案是 link 共享对象与依赖库的关系。例如。
g++ -fPIC -shared twocams.cpp -o -ltwocams -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lz -lwebp -lpthread -ltiff -lpng
创建一个共享库,使加载程序加载所有依赖项。您可以使用 ldd
.
检查依赖关系
库的顺序很重要。如果 libA 依赖于 libB,那么你必须 link 反对 libA,然后反对 libB。
如果您使用 opencv 的共享库,那么您不需要 link 所有其他依赖项。
这是一个分步手册:
安装conan
安装cmake
将存储库 bincrafters 添加到 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/opencv.hpp>
替换为特定的导入:#include <opencv2/core/core.hpp>
和 #include <opencv2/imgproc/imgproc.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
我正在尝试创建一个包含 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++ 代码。任何替代方案都是可以接受的。
当您创建一个共享对象并想要使用它时,您必须 link 您的工件针对此共享对象的所有依赖项。例如。我创建了 libtwocams.so
的
#include <opencv2/videoio.hpp>
void test() {
cv::VideoCapture v;
cv::Mat m;
v >> m;
}
要使用此共享对象,我必须 link 反对 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
另一种解决方案是 link 共享对象与依赖库的关系。例如。
g++ -fPIC -shared twocams.cpp -o -ltwocams -lopencv_core -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio -lz -lwebp -lpthread -ltiff -lpng
创建一个共享库,使加载程序加载所有依赖项。您可以使用 ldd
.
库的顺序很重要。如果 libA 依赖于 libB,那么你必须 link 反对 libA,然后反对 libB。
如果您使用 opencv 的共享库,那么您不需要 link 所有其他依赖项。
这是一个分步手册:
安装conan
安装cmake
将存储库 bincrafters 添加到 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/opencv.hpp>
替换为特定的导入:#include <opencv2/core/core.hpp>
和#include <opencv2/imgproc/imgproc.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