Как собрать статическую библиотеку со связанными зависимостями — CMakeC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как собрать статическую библиотеку со связанными зависимостями — CMake

Сообщение Anonymous »

В настоящее время я использую CMake для создания статической библиотеки, которая использует несколько статических библиотек из OpenCV 4 (core imgcodecs video highgui imgproc). Мое намерение состоит в том, чтобы иметь возможность объединить все необходимые статические библиотеки OpenCV в мою собственную библиотеку, чтобы я мог распространять ее как одну библиотеку. Кроме того, я хочу, чтобы пользователю моей библиотеки не приходилось устанавливать OpenCV 4 в своей системе (но не против, если пользователю придется выполнять простую установку с помощью apt-get install). Я знаю, что существуют инструменты для объединения статических библиотек (например, использование ar для Linux).
Однако на самом деле у меня проблема со всеми зависимостями OpenCV (такими как libjpeg, libpng и т. д.). Я не возражаю, если эти библиотеки включены в состав моей или связаны динамически, поскольку их относительно легко установить (можно установить с помощью sudo apt-get install, тогда как opencv4 необходимо собирать из исходного кода).

Как лучше всего это сделать?
Это мой текущий файл CMakeLists.txt
В настоящее время он работает, но это потому, что я использую find_package(OpenCV ТРЕБУЕТСЯ) (что противоречит цели того, что я пытаюсь сделать). Когда я удаляю эту строку, компоновщик жалуется, что не может найти зависимости OpenCV.

Код: Выделить всё

cmake_minimum_required(VERSION 2.8)
project(myproject)

set(CMAKE_CXX_STANDARD 14)
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)

find_package(OpenMP REQUIRED)
find_package(OpenCV REQUIRED)

set(JSON_BuildTests OFF CACHE INTERNAL "")
add_subdirectory(nlohmann_json)

list(APPEND LINKER_LIBS opencv_core opencv_highgui opencv_video opencv_imgcodecs libmxnet.so libncnn.a nlohmann_json::nlohmann_json)
file(GLOB SRC${CMAKE_CURRENT_LIST_DIR}/src/*.cpp${CMAKE_CURRENT_LIST_DIR}/main.cpp)

add_library(myproject ${SRC})
target_link_libraries(myproject ${LINKER_LIBS} ${OpenMP_CXX_FLAGS})
Чтобы уточнить мой вопрос. Я создаю свой проект, который генерирует libmyproject.a. Затем я беру эту библиотеку и в конечном итоге извлекаю символы из библиотек OpenCV (libopencv_core.a libopencv_highgui.a libopencv_imgcodecs.a libopencv_video.a) и добавляю их в свою библиотеку (на данный момент я еще не сделал этот шаг, который вот почему в приведенном ниже примере я связываю libopencv_*). Затем я использую свою библиотеку в новом проекте, для которого CMakeLists.txt показан ниже:

Код: Выделить всё

cmake_minimum_required(VERSION 2.8)
project(myproject-driver)

set(CMAKE_CXX_STANDARD 14)
include_directories(${CMAKE_CURRENT_LIST_DIR}/include)
link_directories(${CMAKE_CURRENT_LIST_DIR}/lib)
find_package(OpenMP REQUIRED)

add_executable(myproject-driver main.cpp)
target_link_libraries(myproject-driver myproject libncnn.a ${OpenMP_CXX_FLAGS} libmxnet.so libopencv_core.a  libopencv_highgui.a  libopencv_imgcodecs.a  libopencv_video.a)
При сборке возникают следующие ошибки:

Код: Выделить всё

Linking CXX executable myproject-driver
/usr/bin/ld: /home/nchafni/Cyrus/myproject/lib/libopencv_imgcodecs.a(grfmt_jpeg.cpp.o): undefined reference to symbol 'jpeg_default_qtables@@LIBJPEG_8.0'
//usr/lib/x86_64-linux-gnu/libjpeg.so.8: error adding symbols: DSO missing from command line
collect2: error: ld returned 1 exit status
Как это исправить. Есть ли какая-нибудь команда CMake, которая свяжет для меня все эти зависимости? Нужно ли мне вручную отслеживать каждую зависимость этих библиотек libopencv_* и связывать их вручную? Еще раз, это предполагает, что человек, использующий libmyproject.a, не может использовать find_package(OpenCV REQUIRED), поскольку он не будет определен, поскольку он не установил OpenCV на свой компьютер.

Подробнее здесь: https://stackoverflow.com/questions/568 ... cies-cmake
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»