[英]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++代碼。 任何替代方案都是可以接受的。
當您創建一個共享對象並想要使用它時,您必須將您的工件鏈接到該共享對象的所有依賴項。 例如,我創建了一個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 的共享庫,則不需要鏈接所有其他依賴項。
這是分步手冊:
安裝柯南
安裝cmake
將存儲庫 bincrafters 添加到 conan
conan remote add bincrafters https://api.bintray.com/conan/bincrafters/public-conan
創建:
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')
為了解決這個問題,我做了以下事情:
#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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.