cmake
Поиск и использование установленных пакетов, библиотек и программ
Поиск…
Синтаксис
- find_package (pkgname [версия] [EXACT] [QUIET] [ТРЕБУЕТСЯ])
- включают в себя (FindPkgConfig)
- pkg_search_module (префикс [ТРЕБУЕТСЯ] [QUIET] pkgname [otherpkg ...])
- pkg_check_modules (префикс [ТРЕБУЕТСЯ] [QUIET] pkgname [otherpkg ...])
параметры
параметр | подробности |
---|---|
версия (необязательно) | Минимальная версия пакета, определяемая основным номером и необязательно небольшим, патчем и номером настройки, в формате major.minor.patch.tweak |
EXACT (необязательно) | Укажите, что версия, указанная в version является точной версией, которая будет найдена |
ТРЕБУЕТСЯ (необязательно) | Автоматически выдает ошибку и останавливает процесс, если пакет не найден |
QUIET (необязательно) | Функция не будет отправлять какое-либо сообщение на стандартный вывод |
замечания
Способ
find_package
совместим со всей платформой, тогда как путьpkg-config
доступен только на Unix-подобных платформах, таких как Linux и OSX.Полное описание многочисленных параметров и опций
find_package
можно найти в руководстве .Несмотря на то, что можно указать многие дополнительные параметры, такие как версия пакета, не все модули Find правильно используют все эти параметры. Если произойдет какое-либо неопределенное поведение, может потребоваться найти модуль в пути установки CMake и исправить или понять его поведение.
Используйте find_package и найдите .cmake модули
По умолчанию для поиска установленных пакетов с CMake используется функция find_package
в сочетании с файлом Find<package>.cmake
. Цель файла - определить правила поиска для пакета и установить разные переменные, такие как <package>_FOUND
, <package>_INCLUDE_DIRS
и <package>_LIBRARIES
.
Многие файлы Find<package>.cmake
уже определены по умолчанию в CMake. Однако, если нет ${CMAKE_SOURCE_DIR}/cmake/modules
файла для пакета, вы всегда можете написать свой собственный и поместить его в ${CMAKE_SOURCE_DIR}/cmake/modules
(или любой другой каталог, если CMAKE_MODULE_PATH
был переопределен)
Список модулей по умолчанию можно найти в руководстве (v3.6) . Необходимо проверить руководство в соответствии с версией CMake, используемой в проекте, или же там могут отсутствовать модули. Также можно найти установленные модули с помощью cmake --help-module-list
.
Хороший пример для FindSDL2.cmake
на Github
Вот базовый CMakeLists.txt
, который потребует SDL2:
cmake_minimum_required(2.8 FATAL_ERROR)
project("SDL2Test")
set(CMAKE_MODULE_PATH "${CMAKE_MODULE_PATH} ${CMAKE_SOURCE_DIR}/cmake/modules")
find_package(SDL2 REQUIRED)
include_directories(${SDL2_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})
Используйте pkg_search_module и pkg_check_modules
В Unix-подобных операционных системах можно использовать программу pkg-config
для поиска и настройки пакетов, которые предоставляют файл <package>.pc
.
Чтобы использовать pkg-config
, необходимо include(FindPkgConfig)
в CMakeLists.txt
. Тогда есть две возможные функции:
-
pkg_search_module
, который проверяет пакет и использует первый доступный. -
pkg_check_modules
, которые проверяют все соответствующие пакеты.
Вот базовый CMakeLists.txt
который использует pkg-config
для поиска SDL2 с версией выше или равной 2.0.1:
cmake_minimum_required(2.8 FATAL_ERROR)
project("SDL2Test")
include(FindPkgConfig)
pkg_search_module(SDL2 REQUIRED sdl2>=2.0.1)
include_directories(${SDL2_INCLUDE_DIRS})
add_executable(${PROJECT_NAME} main.c)
target_link_libraries(${PROJECT_NAME} ${SDL2_LIBRARIES})