CMake Ved Eksempel

Mirko Kiefer

div >

når jeg prøvde å lære cmake, kunne jeg ikke finne noen god introduksjon. CMake-dokumentasjonen er ganske omfattende, men ikke egnet for en nybegynner. Det er noen nyttige opplæringsprogrammer knyttet til Cmake Wiki, men de fleste dekker bare svært spesifikke problemer eller er for grunnleggende. Så jeg skrev denne korte CMake-introduksjonen som en destillert versjon av det jeg fant ut etter å ha jobbet gjennom docs og følgende stackoverflow-spørsmål.

Det er et arbeid som pågår, og jeg vil prøve å kontinuerlig forbedre det.

CMake Er en meta bygge verktøy som lar deg generere innfødte bygge skript for en rekke plattformer:

  • Unix Makefiles
  • Xcode
  • Visual Studio
  • CodeBlocks
  • Eclipse
  • og mer…

Se hele listen Over CMake generatorer.

la oss anta at vi har en enkel app med en enkelt .c-fil.

Vi ved å opprette enCMakeLists.txt fil i roten av prosjektet vårt.

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

Det er alt vi trenger for å kunne bygge vår app med noen av de tilgjengelige generatorene.

add_executable definerer vår binære med alle koblede kildefiler.

install forteller cmake å installere vår binære ibin katalogen av installasjonsmappen.

Building

CMake støtter ut-av-kilde bygger – så all vår kompilert kode går inn i en katalog separat til kildene.

for å starte en build oppretter vi en ny mappe:

mkdir _build
cd _build

og ring cmake med banen til prosjektets rot (i dette tilfellet overordnet mappe):

cmake ..

dette vil generere byggeskript ved hjelp av standardgeneratoren — På Linux/OSX bør Dette Være Makefiles.som standard vil cmake installere vår bygge inn i systemkatalogene.
for å definere en egendefinert installasjonskatalog sender vi den bare til cmake:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

for å kjøre build-skriptet kan Du bare bruke Makefile:

make
make install

Vi kan nå kjøre vår binære fra installasjonsmappen:

../_install/bin/myapp

hvis vi ønsket å bruke en annen generator sender vi den til cmake ved hjelp av -G parameter:

cmake .. -GXcode

dette vil sende et lett konfigurert xcode-prosjekt For Å Bygge vår app.

Bruke CMake med biblioteker

for å bygge et bibliotek bruker vi et lignende skript:

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 vil bygge biblioteket som libtest.a og installer det i lib-mappen i installasjonsmappen.
vi inkluderer også vår offentlige header-fil i installasjonstrinnet og forteller cmake å sette den inn iinclude.

I Stedet for et statisk bibliotek kan vi også bygge en delt lib:

add_library(test SHARED test.c)

Koble biblioteker til kjørbare filer med CMake

vi kan utvide vår kjørbar ovenfra ved å koble den til vår libray libtest.a.

La oss starte med å legge til bibliotekets katalog som en underkatalog til vårt myapp-prosjekt.

Nå kan vi bruke biblioteket definert I CMakeLists.txt av libtest_project i myapps CMakeLists.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 gjør bibliotekettest definert i libtestproject tilgjengelig for byggingen.
I target_link_libraries vi forteller CMake å koble den til vår kjørbar. CMake vil sørge for å først bygge test før du kobler den til myapp.

Inkludert eksterne biblioteker som bruker andre byggesystemer

Mens CMake nyter økende interesse, er Det fortsatt mange biblioteker som bruker innfødte byggesystemer som Unix Makefiles. Du kan gjøre bruk av dem i CMake prosjektet uten å måtte omskrive sine bygge skript.

Alt Vi trenger Er Cmakes støtte for eksterne prosjekter og importerte biblioteker:

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_Addtillater oss å legge til et eksternt prosjekt som et mål for prosjektet vårt. Hvis du ikke angir kommandoer somBUILD_COMMANDellerINSTALL_COMMAND, Vil CMake se etter enCMakeLists.txti det eksterne prosjektet og utføre det.
i vårt tilfelle ønsker vi å gjøre bruk av luajit biblioteket som er bygget ved Hjelp Av En Makefile.add_librarystøtter import av allerede bygget biblioteker også-vi må bare sette sinIMPORTED_LOCATIONeiendom.
KallerExternalProject_Addangir bare det eksterne prosjektet som et mål, men bygger det ikke automatisk. Det vil bare bli bygget hvis vi legger til en avhengighet til den. Vi kaller derforadd_dependenciesfor å gjøre vårt importerte bibliotek avhengig av det eksterne prosjektet.

Endelig kan vi koble vårt importerte bibliotek akkurat som et «normalt» bibliotek medtarget_link_libraries.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *