Подтвердить что ты не робот

Как сообщить cmake Мне нужно, чтобы мой проект связывал библиотеки статически?

Я пытаюсь создать проект на основе OpenCV, используя CMake, работающий в Linux. Пока мои файлы CMakeLists.txt выглядят примерно так:

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})

но это приводит к динамически связанным библиотекам. Как связать со статическими библиотеками?

4b9b3361

Ответ 1

Вы создаете статические библиотеки OpenCV, просто устанавливая флаг BUILD_SHARED_LIBS в false в CMake. Тогда все, что вам нужно сделать, чтобы создать собственное приложение с этими статическими библиотеками, - это добавить зависимость от OpenCV в CMakeLists.txt:

FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (your-application ${OpenCV_LIBS})

и CMake позаботится обо всем.

Ответ 2

Чтобы связать все статически, я считаю, что вы ищете CMAKE_EXE_LINKER_FLAGS (добавьте -static).

Используете ли вы простой метод OpenCVConfig.cmake? или более старый FindOpenCV.cmake?

Ответ 3

На самом деле эта проблема уже исправлена ​​в OpenCVConfig.cmake, которая поставляется с OpenCV. Все, что вам нужно сделать, это определить OpenCV_STATIC в CMakeLists.txt. То есть.

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)

Ответ 4

AFAIK немного сложнее, потому что CMake, точнее команда find_library, предпочитает разделяемые библиотеки и находит их, если доступны как общие, так и статические.

Я все еще ищу хорошее решение, чтобы иметь возможность компилировать двоичные файлы "как можно более статичными", но пока не нашел элегантного решения. Единственный способ, которым он, несомненно, будет работать, - это реализовать все через пользовательские модули FindXXXX.

Ответ 6

Обратите внимание, что gcc отказывается связывать, если вы передаете параметр -static, но у вас есть динамические libs в аргументах ссылки - что вы будете, если просто просто используете FindOpenCV.cmake, и это поднимет динамические библиотеки (я не знаю, как работает OpenCVConfig.cmake)...