CMake de exemplu

Mirko Kiefer
22 februarie 2017 · 4 min citit

atunci când încearcă să învețe cmake nu am putut găsi nici o introducere bun. Documentația CMake este destul de cuprinzătoare, dar nu este potrivită pentru un începător. Există câteva tutoriale utile legate de CMake Wiki, dar cele mai multe dintre ele acoperă doar probleme foarte specifice sau sunt prea de bază. Așa că am scris această scurtă introducere CMake ca o versiune distilată a ceea ce am aflat după ce am lucrat prin documente și după întrebările stackoverflow.

este o lucrare în desfășurare și voi încerca să o îmbunătățesc continuu.

CMake este un instrument construi meta care vă permite să genereze script-uri native construi pentru o serie de platforme:

  • Unix Makefiles
  • Xcode
  • Visual Studio
  • CodeBlocks
  • Eclipse
  • și mai mult…

a se vedea lista completă a generatoarelor CMake.

Să presupunem că avem o aplicație simplă cu un singur .fișier C.

noi prin crearea unuiCMakeLists.txt fișier în rădăcina proiectului nostru.

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

asta e tot ce avem nevoie pentru a putea construi aplicația noastră cu oricare dintre generatoarele disponibile.

add_executable definește binarul nostru cu toate fișierele sursă legate.

install îi spune lui cmake să instaleze binarul nostru în directorulbin al directorului de instalare.

clădire

CMake acceptă out-of-source construiește — astfel încât toate codul nostru compilat merge într-un director separat de sursele.

pentru a începe o construcție, creăm un nou folder:

mkdir _build
cd _build

și apelăm cmake cu calea către rădăcina proiectului (în acest caz folderul părinte):

cmake ..

aceasta va genera scripturi de construire folosind generatorul implicit — pe Linux/OSX acest lucru ar trebui să fie Makefiles.

în mod implicit cmake va instala construi noastre în directoarele de sistem.
pentru a defini un director de instalare personalizat, îl transmitem pur și simplu la cmake:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

pentru a rula scriptul de construire, puteți utiliza pur și simplu fișierul Makefile:

make
make install

acum putem rula binarul nostru din Directorul de instalare:

../_install/bin/myapp

dacă am dori să folosim un generator diferit, îl transmitem cmake folosind -G parametru:

cmake .. -GXcode

acest lucru va afișa un proiect Xcode ușor configurat pentru a construi aplicația noastră.

utilizarea CMake cu biblioteci

pentru a construi o bibliotecă vom folosi un script similar:

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 va construi biblioteca calibtest.a și instalați-l în folderul lib din Directorul de instalare.
includem, de asemenea, fișierul nostru antet public în etapa de instalare și spune cmake să-l pună îninclude.

în locul unei biblioteci statice putem construi și un lib partajat:

add_library(test SHARED test.c)

conectând bibliotecile la executabile cu CMake

putem extinde executabilul nostru de sus conectându-l la libray libtest.a.

să începem prin adăugarea directorului Bibliotecii ca subdirector la proiectul nostru myapp.

acum, putem folosi biblioteca definită în CMakeLists.txt de libtest_project în CMakeLists myapp lui.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 face bibliotecatest definit în libtestproject disponibil pentru a construi.
Întarget_link_libraries îi spunem lui CMake să-l conecteze la executabilul nostru. CMake va asigurați-vă că pentru a construi primul test înainte de conectarea la myapp.

inclusiv biblioteci externe care utilizează alte sisteme de construire

în timp ce CMake se bucură de un interes tot mai mare, există încă o mulțime de biblioteci care utilizează sisteme de construire native, cum ar fi Unix Makefiles. Puteți face uz de ele în proiectul CMake fără a fi nevoie să re-scrie script-urile lor construi.

tot ce avem nevoie este suportul CMake pentru proiecte externe și biblioteci importate:

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 ne permite să adăugăm un proiect extern ca țintă la proiectul nostru. Dacă nu specificați comenzi precumBUILD_COMMAND sauINSTALL_COMMAND, CMake va căuta unCMakeLists.txt în proiectul extern și îl va executa.
în cazul nostru vrem să facă uz de Biblioteca luajit, care este construit folosind un Makefile.

add_library acceptă și importul bibliotecilor deja construite – trebuie doar să setăm proprietateaIMPORTED_LOCATION.
apelareaExternalProject_Add specifică doar proiectul extern ca țintă, dar nu îl construiește automat. Acesta va fi construit numai dacă adăugăm o dependență. Prin urmare, apelăm add_dependencies pentru a face biblioteca noastră importată dependentă de proiectul extern.

în cele din urmă putem lega biblioteca noastră importată la fel ca o bibliotecă „normală” cutarget_link_libraries.

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *