Создание .so файла с использованием ctypes, когда opencv включен в код C ++ - PullRequest
0 голосов
/ 30 октября 2018

Я пытаюсь создать .so файл из файла c ++ (twocams.cpp), который включает 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

Как решить эту проблему? Я хочу использовать код C ++ в Python. Любая альтернатива приемлема.

1 Ответ

0 голосов
/ 30 октября 2018

Когда вы создаете общий объект и хотите его использовать, вы должны связать свой артефакт со всеми зависимостями этого общего объекта. Например. Я создаю 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

Добавление хранилища хранилища в conan

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

Создать:

  • conanfile.txt
  • CMakeLists.txt
  • ЦСИ / 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 .
...