cmake
Sök och använd installerade paket, bibliotek och program
Sök…
Syntax
- find_package (pkgname [version] [EXACT] [QUIET] [REQUIRED])
- innefattar (FindPkgConfig)
- pkg_search_module (prefix [REQUIRED] [QUIET] pkgname [otherpkg ...])
- pkg_check_modules (prefix [REQUIRED] [QUIET] pkgname [otherpkg ...])
parametrar
Parameter | detaljer |
---|---|
version (valfritt) | Minsta version av paketet definierat av ett huvudnummer och valfritt ett mindre, patch- och tweak-nummer, i formatet major.minor.patch.tweak |
EXAKT (valfritt) | Ange att den version som anges i version är den exakta versionen som ska hittas |
KRAV (valfritt) | Kasta automatiskt ett fel och stoppa processen om paketet inte hittas |
Tyst (valfritt) | Funktionen skickar inte något meddelande till standardutgången |
Anmärkningar
find_package
sättet är kompatibelt på alla plattformar, medanpkg-config
är tillgängligt på Unix-liknande plattformar, som Linux och OSX.En fullständig beskrivning av de många parametrarna och alternativen för
find_package
finns i handboken .Även om det är möjligt att specificera många valfria parametrar som paketversionen, använder inte alla Find-moduler alla dessa parametrar korrekt. Om något odefinierat beteende inträffar kan det vara nödvändigt att hitta modulen i CMakes installationsväg och fixa eller förstå dess beteende.
Använd find_package och Find .cmake-moduler
Standard sättet att hitta installerade paket med CMake är att använda funktionen find_package
tillsammans med en Find<package>.cmake
fil. Syftet med filen är att definiera sökreglerna för paketet och ställa in olika variabler, till exempel <package>_FOUND
, <package>_INCLUDE_DIRS
och <package>_LIBRARIES
.
Många Find<package>.cmake
filer är redan definierade som standard i CMake. Men om det inte finns någon fil för det paket du behöver kan du alltid skriva din egen och lägga den i ${CMAKE_SOURCE_DIR}/cmake/modules
(eller någon annan katalog om CMAKE_MODULE_PATH
åsidosattes)
En lista över standardmoduler finns i handboken (v3.6) . Det är viktigt att kontrollera manualen enligt den version av CMake som används i projektet, annars kan det saknas moduler. Det är också möjligt att hitta de installerade modulerna med cmake --help-module-list
.
Det finns ett fint exempel på en FindSDL2.cmake
på Github
Här är en grundläggande CMakeLists.txt
som kräver 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})
Använd pkg_search_module och pkg_check_modules
På Unix-liknande operativsystem är det möjligt att använda pkg-config
programmet för att hitta och konfigurera paket som tillhandahåller en <package>.pc
fil.
För att använda pkg-config
är det nödvändigt att ringa include(FindPkgConfig)
i ett CMakeLists.txt
. Sedan finns det två möjliga funktioner:
-
pkg_search_module
, som söker efter paketet och använder det första tillgängliga. -
pkg_check_modules
, som kontrollerar för alla motsvarande paket.
Här är en grundläggande CMakeLists.txt
som använder pkg-config
att hitta SDL2 med version ovan eller lika med 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})