cmake
Zoek en gebruik geïnstalleerde pakketten, bibliotheken en programma's
Zoeken…
Syntaxis
- find_package (pkgname [version] [EXACT] [QUIET] [REQUIRED])
- omvatten (FindPkgConfig)
- pkg_search_module (voorvoegsel [REQUIRED] [QUIET] pkgname [otherpkg ...])
- pkg_check_modules (voorvoegsel [REQUIRED] [QUIET] pkgname [otherpkg ...])
parameters
Parameter | Details |
---|---|
versie (optioneel) | Minimale versie van het pakket gedefinieerd door een hoofdnummer en optioneel een ondergeschikt, patch- en tweaknummer, in de indeling major.minor.patch.tweak |
EXACT (optioneel) | Geef op dat de versie die is opgegeven in de version de exacte versie is die moet worden gevonden |
VERPLICHT (optioneel) | Hiermee wordt automatisch een fout gegenereerd en wordt het proces gestopt als het pakket niet wordt gevonden |
STIL (optioneel) | De functie verzendt geen berichten naar de standaarduitvoer |
Opmerkingen
De manier van
find_package
is compatibel op elk platform, terwijl de manier vanpkg-config
alleen beschikbaar is op Unix-achtige platforms, zoals Linux en OSX.Een volledige beschrijving van het
find_package
talloze parameters en opties zijn te vinden in de handleiding .Hoewel het mogelijk is om veel optionele parameters op te geven, zoals de versie van het pakket, gebruiken niet alle Find-modules al die parameters correct. Als er ongedefinieerd gedrag optreedt, kan het nodig zijn om de module in het installatiepad van CMake te vinden en het gedrag te corrigeren of te begrijpen.
Gebruik find_package en Find .cmake modules
De standaardmanier om geïnstalleerde pakketten met find_package
te vinden, is de functie find_package
te gebruiken in combinatie met een Find<package>.cmake
bestand. Het doel van het bestand is om de <package>_FOUND
voor het pakket te definiëren en verschillende variabelen in te stellen, zoals <package>_FOUND
, <package>_INCLUDE_DIRS
en <package>_LIBRARIES
.
Veel Find<package>.cmake
bestand zijn al standaard gedefinieerd in CMake. Als er echter geen bestand is voor het pakket dat u nodig hebt, kunt u altijd uw eigen schrijven en deze in ${CMAKE_SOURCE_DIR}/cmake/modules
(of een andere map als CMAKE_MODULE_PATH
werd overschreven)
Een lijst met standaardmodules is te vinden in de handleiding (v3.6) . Het is essentieel om de handleiding te controleren volgens de versie van CMake die in het project wordt gebruikt, anders kunnen er modules ontbreken. Het is ook mogelijk om de geïnstalleerde modules te vinden met cmake --help-module-list
.
Er is een mooi voorbeeld voor een FindSDL2.cmake
op Github
Hier is een eenvoudige CMakeLists.txt
die CMakeLists.txt
zou vereisen:
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})
Gebruik pkg_search_module en pkg_check_modules
Op Unix-achtige besturingssystemen is het mogelijk om het programma pkg-config
te gebruiken om pakketten te vinden en te configureren die een <package>.pc
bestand bieden.
Om pkg-config
, is het noodzakelijk om include(FindPkgConfig)
in een CMakeLists.txt
. Dan zijn er 2 mogelijke functies:
-
pkg_search_module
, die controleert op het pakket en de eerste beschikbare gebruikt. -
pkg_check_modules
, die alle bijbehorende pakketten controleren.
Hier is een eenvoudige CMakeLists.txt
die pkg-config
gebruikt om SDL2 te vinden met een versie hoger dan of gelijk aan 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})