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_Add
tillater oss å legge til et eksternt prosjekt som et mål for prosjektet vårt. Hvis du ikke angir kommandoer somBUILD_COMMAND
ellerINSTALL_COMMAND
, Vil CMake se etter enCMakeLists.txt
i 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_library
støtter import av allerede bygget biblioteker også-vi må bare sette sinIMPORTED_LOCATION
eiendom.
KallerExternalProject_Add
angir 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_dependencies
for å 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
.