Как сообщить cmake Мне нужно, чтобы мой проект связывал библиотеки статически?
Я пытаюсь создать проект на основе OpenCV, используя CMake, работающий в Linux. Пока мои файлы CMakeLists.txt
выглядят примерно так:
FIND_PACKAGE (OpenCV REQUIRED)
...
TARGET_LINK_LIBRARIES (my-executable ${OpenCV_LIBS})
но это приводит к динамически связанным библиотекам. Как связать со статическими библиотеками?
Ответы
Ответ 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.
Ответ 5
в строке add_library укажите static. См. http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library
Исправление, так как вы хотите связать себя со статической библиотекой, я бы посмотрел на
CMAKE_FIND_LIBRARY_SUFFIXES свойство
Ответ 6
Обратите внимание, что gcc отказывается связывать, если вы передаете параметр -static, но у вас есть динамические libs в аргументах ссылки - что вы будете, если просто просто используете FindOpenCV.cmake, и это поднимет динамические библиотеки (я не знаю, как работает OpenCVConfig.cmake)...