Как мне сказать cmake, что я хочу, чтобы мой проект статически связывал библиотеки? - PullRequest
18 голосов
/ 21 сентября 2010

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

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

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

Ответы [ 7 ]

7 голосов
/ 23 мая 2012

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

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

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

7 голосов
/ 21 сентября 2010

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

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

5 голосов
/ 14 ноября 2014

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

set(OpenCV_STATIC ON)
find_package(OpenCV REQUIRED)
3 голосов
/ 21 сентября 2010

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

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

1 голос
/ 21 сентября 2010

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

1 голос
/ 21 сентября 2010

в строке add_library укажите статический. Смотри http://www.cmake.org/cmake/help/cmake-2-8-docs.html#command:add_library

Исправление, так как вы ищете ссылку на статическую библиотеку, я бы посмотрел в CMAKE_FIND_LIBRARY_SUFFIXES свойство

0 голосов
/ 06 марта 2019
SET (CMAKE_EXE_LINKER_FLAGS "-static")
...