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_packagesä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_packagefinns 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})