LINUX.ORG.RU

[cmake] поиск дополнительных библиотек

 


1

0

cmake может к примеру находить библиотеки gtk, а как с помошью его находить другие для которых не написан модуль, например libgconf? Интересует поиск пути к заголовкам и библиотекам. Или для этого принято вызывать pkg-config? А что если библиотеки нет даже в базе pkg-config?

★★★

Для этого самому пишется файл вида: FindMyCoolLibrary.cmake и ложится в некую директорию, путь к которой указывается:

set( CMAKE_MODULE_PATH "my_directory_with_find_something" )

И далее:

find_package( MyCoolLibrary )

Внутри самого Find*.cmake библиотека ищется с помощью find_library(), find_program() и тому подобного. Вообще разрешается использовать любые приёмы для поиска файлов, но большинство уже сгруппировано в find_* функции для удобства. Если библиотека не найдена, то правила хорошего тона требуют экспортировать переменные в кеш, чтобы пользователь мог сам указать пути к заголовочникам/библиотекам. Если найдена по стандартным путям - то эти переменные в кеше прячутся под Advanced Variables закладки, чтобы в случае чего пользователь мог сменить версию библиотеки. Также версию часто можно выбирать с помощью переменных окружения для каждого конкретного Find*.cmake модуля, чтобы узнать с помощью каких именно переменных окружения - следует читать сам cmake-скрипт.

Dendy ★★★★★
()
Ответ на: комментарий от Dendy

Да, если библиотека простая, то можно просто вызвать find_library() прямо в CMakeLists.txt. При этом если библиотека не обнаружится, то find_library() автоматом создаст переменные в кеше, чтобы можно было указать руками пути к ней. Подробнее в документации.

Dendy ★★★★★
()

Вот пример поиска альсалиб:

include(LibFindMacros)

libfind_pkg_check_modules(ALSA_PKGCONF alsa)

find_path(ALSA_INCLUDE_DIR
    NAMES alsa/asoundlib.h
    PATHS ${ALSA_PKGCONF_INCLUDE_DIRS}
)

find_library(ALSA_LIBRARY
    NAMES asound
    PATHS ${ALSA_PKGCONF_LIBRARY_DIRS}
)

set(ALSA_PROCESS_INCLUDES ALSA_INCLUDE_DIR)
set(ALSA_PROCESS_LIBS ALSA_LIBRARY)
libfind_process(ALSA)

Вот так использовать в самом CMakeLists.txt

find_package(ALSA)
include_directories(${ALSA_INCLUDE_DIRS})
set(LIBS ${LIBS} ${ALSA_LIBRARIES})
Zenom ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.