CMake Voorbeeld

Mirko Kiefer
Feb 22, 2017 · 4 min lezen

Wanneer het proberen om te leren CMake ik kon het niet vinden een goede inleiding. De cmake documentatie is vrij uitgebreid, maar niet geschikt voor een beginner. Er zijn een aantal handige tutorials gelinkt op de cmake Wiki maar de meeste van hen behandelen alleen zeer specifieke problemen of zijn te basic. Dus ik schreef deze korte cmake introductie als een gedistilleerde versie van wat ik ontdekte na het werken door de documenten en het volgen van stackoverflow vragen.

Het is een werk in uitvoering en Ik zal proberen om het voortdurend te verbeteren.

CMake is een meta build tool waarmee u native build scripts kunt genereren voor een reeks platforms:

  • Unix Makefiles
  • Xcode
  • Visual Studio
  • CodeBlocks
  • Eclipse
  • en meer…

zie de volledige lijst van cmake-generatoren.

laten we aannemen dat we een eenvoudige app met een enkele hebben .C-bestand.

We maken een CMakeLists.txt bestand in de root van ons project.

cmake_minimum_required(VERSION 2.8)project(app_project)add_executable(myapp main.c)install(TARGETS myapp DESTINATION bin)

dat is alles wat we nodig hebben om onze app te kunnen bouwen met een van de beschikbare generatoren.

add_executable definieert onze binary met alle gekoppelde bronbestanden.

install vertelt cmake om onze binaire map te installeren in de bin map van de installatiemap.

Building

CMake ondersteunt Out-of-source builds-dus al onze gecompileerde code gaat naar een map die gescheiden is van de bronnen.

om een build te starten maken we een nieuwe map:

mkdir _build
cd _build

en roepen cmake aan met het pad naar de root van het project (in dit geval de bovenliggende map):

cmake ..

Dit zal build scripts genereren met behulp van de standaard generator — op Linux/OSX zouden dit Makefiles moeten zijn.

standaard installeert cmake onze build in de systeemmappen.
Om een aangepaste installatiemap te definiëren geven we deze gewoon door aan cmake:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

om het build script uit te voeren kunt u eenvoudig het Makefile gebruiken:

make
make install

We kunnen nu onze binary uitvoeren vanuit de installatiemap:

../_install/bin/myapp

als we een andere generator willen gebruiken, geven we het door aan cmake met behulp van de -G parameter:

cmake .. -GXcode

dit zal een gemakkelijk geconfigureerd Xcode project om onze app te bouwen.

cmake gebruiken met bibliotheken

om een bibliotheek te bouwen gebruiken we een soortgelijk script:

cmake_minimum_required(VERSION 2.8)project(libtest_project)add_library(test STATIC test.c)install(TARGETS test DESTINATION lib)
install(FILES test.h DESTINATION include)

CMake zal de bibliotheek bouwen als libtest.a en installeren in de lib-map van de installatiemap.
We nemen ook ons publieke headerbestand op in de installatiestap en vertellen cmake om het in includete zetten.

in plaats van een statische bibliotheek kunnen we ook een gedeelde lib bouwen:

add_library(test SHARED test.c)

linking libraries to executables with CMake

We kunnen ons uitvoerbaar bestand van bovenaf uitbreiden door het te koppelen aan onze libray libtest.a.

laten we beginnen met het toevoegen van de map van de bibliotheek als een submap aan ons myapp project.

nu kunnen we de bibliotheek gebruiken die is gedefinieerd in CMakeLists.txt van libtest_project in de cmakelists van myapp.txt:

cmake_minimum_required(VERSION 2.8)project(myapp)add_subdirectory(libtest_project)add_executable(myapp main.c)target_link_libraries(myapp test)install(TARGETS myapp DESTINATION bin)

add_subdirectory maakt de bibliotheek test gedefinieerd in libtestproject beschikbaar voor de build.
In target_link_libraries vertellen we CMake om het te koppelen aan ons uitvoerbaar bestand. CMake zorgt ervoor dat u eerst test bouwt voordat u deze koppelt aan myapp.

inclusief externe bibliotheken die andere bouwsystemen gebruiken

hoewel CMake steeds meer interesse heeft, zijn er nog steeds veel bibliotheken die eigen bouwsystemen gebruiken zoals Unix Makefiles. U kunt er gebruik van maken in uw cmake-project zonder dat u hun build-scripts opnieuw hoeft te schrijven.

alles wat we nodig hebben is cmake ‘ s ondersteuning voor externe projecten en geïmporteerde bibliotheken:

ExternalProject_Add(project_luajit
URL http://luajit.org/download/LuaJIT-2.0.1.tar.gz
PREFIX ${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
CONFIGURE_COMMAND ""
BUILD_COMMAND make
INSTALL_COMMAND make install
PREFIX=${CMAKE_CURRENT_BINARY_DIR}/luajit-2.0.1
)ExternalProject_Get_Property(project_luajit install_dir)add_library(luajit STATIC IMPORTED)set_property(TARGET luajit PROPERTY IMPORTED_LOCATION ${install_dir}/lib/libluajit-5.1.a)add_dependencies(luajit project_luajit)add_executable(myapp main.c)include_directories(${install_dir}/include/luajit-2.0)target_link_libraries(myapp luajit)

ExternalProject_Add stelt ons in staat om een extern project als doel aan ons project toe te voegen. Als u geen commando ‘ s opgeeft zoals BUILD_COMMAND of INSTALL_COMMAND, zal CMake in het externe project naar een CMakeLists.txt zoeken en uitvoeren.
in ons geval willen we gebruik maken van de luajit bibliotheek die is gebouwd met behulp van een Makefile.

add_library ondersteunt ook het importeren van reeds gebouwde bibliotheken – we hoeven alleen de eigenschap IMPORTED_LOCATION in te stellen.
ExternalProject_Add specificeert alleen het externe project als een doel, maar bouwt het niet automatisch. Het zal alleen worden opgebouwd als we er een afhankelijkheid aan toevoegen. We roepen daarom add_dependencies aan om onze geïmporteerde bibliotheek afhankelijk te maken van het externe project.

tot slot kunnen we onze geïmporteerde bibliotheek net als een “normale” bibliotheek linken met target_link_libraries.

Geef een antwoord

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *