簡體   English   中英

當 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++代碼。 任何替代方案都是可以接受的。

當您創建一個共享對象並想要使用它時,您必須將您的工件鏈接到該共享對象的所有依賴項。 例如,我創建了一個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

創建:

  • 配置文件.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')

為了解決這個問題,我做了以下事情:

  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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM