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