2015-02-16 2 views
4

В CMake мы используем TARGET_LINK_LIBRARIES() для связывания разделяемой библиотеки с библиотекой/исполняемым файлом.Как связать статическую библиотеку с исполняемым файлом с помощью CMake

For example: 
TARGET_LINK_LIBRARIES(ExecutableName xxx) 
    where ExecutableName - is the name of executable 
     xxx - is the library name. 

На моем понимании CMake ищет "libxxx.so" на путях, указанных в LINK_DIRECTORIES() макрос. Но если у меня есть сторонняя библиотека с именем «libxxx.a», то как мне связать библиотеку с исполняемым файлом с помощью CMake.

Благодарим за помощь!

ответ

1

Просто указав имя файла библиотеки должно работать:

TARGET_LINK_LIBRARIES(ExecutableName libxxx.a) 

и

TARGET_LINK_LIBRARIES(ExecutableName xxx) 

на самом деле должен работать тоже как бы не искать .so, но для libxxx.a файла в поиске пути.

+1

Это не переносится ... – kyb

3

Вы всегда должны пытаться передать либо полные пути, либо цели CMake в target_link_libraries.

Поскольку вы, похоже, не создаете зависимость как часть проекта CMake, единственный способ получить цель CMake для ссылки - создать импортированную цель. Обычно это довольно утомительно для manuall, поэтому, если зависимость уже не предоставляет файл конфигурации с импортированной целью, вы, вероятно, не хотите идти по этой дороге. Импортированные цели наиболее удобны в использовании, но только если вы можете заставить CMake написать для вас.

Итак, это абсолютные пути. Очевидно, вы не захотите жестко кодировать абсолютные пути библиотеки в своих CMakeLists. Как указано в вашем вопросе, желаемое поведение заключается в том, что вы указываете только имя библиотеки, и CMake должен иметь возможность автоматически определять свое местоположение. Это именно то, что делает find_library для вас.

Чтобы связать с библиотекой xxx, вы могли бы сделать что-то вроде этого:

find_library(LIB_LOCATION xxx) 
target_link_libraries(ExecutableName ${LIB_LOCATION}) 

Обратите внимание, что find_library предоставляет множество возможностей для дальнейшего указать, где искать запрошенные библиотеки. Избавьтесь от существующего вызова link_directories и добавьте соответствующие пути в качестве подсказок для find_library.

Этот подход является более гибким при переносе вашего кода CMake на другие платформы и более легко отлаживается, если что-то пойдет не так, как ваш первоначальный подход.

+1

Как узнать find_library для поиска статической библиотеки? find_library (CURL_LIBRARY_LIB_LOCATION curl) по-прежнему печатает путь '/usr/lib/x86_64-linux-gnu/libcurl.so'. –

+0

@BTRNaidu В этом случае вы должны [указать полное имя библиотеки, включая '.a'] (https://cmake.org/cmake/help/v3.9/command/find_library.html). Обратите внимание, что вы можете дать несколько имен для поиска 'find_library'. Итак, последняя команда будет выглядеть примерно так: 'find_library (l NAMES libcurl.a curl)'. Я согласен с тем, что это не самое приятное решение, но в настоящее время это единственный способ сказать CMake, который можно взять, если у вас есть как статические, так и динамические версии. – ComicSansMS

+0

и он работает. Благодарю. –

Смежные вопросы