CMake genom exempel

Mirko Kiefer
Feb 22, 2017 · 4 min läs

När jag försökte lära mig cmake kunde jag inte hitta någon bra introduktion. Cmake-dokumentationen är ganska omfattande men inte lämplig för en nybörjare. Det finns några användbara handledning länkade på CMake Wiki men de flesta täcker bara mycket specifika problem eller är för grundläggande. Så jag skrev den här korta cmake-introduktionen som en destillerad version av vad jag fick reda på efter att ha arbetat igenom dokumenten och följt stackoverflow-frågor.

det är ett pågående arbete och jag kommer att försöka kontinuerligt förbättra det.

CMake är ett meta-byggverktyg som låter dig generera inbyggda byggskript för en rad plattformar:

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

se hela listan över CMake-generatorer.

låt oss anta att vi har en enkel app med en singel .C-fil.

vi genom att skapa en CMakeLists.txt fil i roten till vårt projekt.

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

det är allt vi behöver för att kunna bygga vår app med någon av de tillgängliga generatorerna.

add_executable definierar vår binär med alla länkade källfiler.

install berättar för cmake att installera vår binär ibin katalogen i installationskatalogen.

Building

CMake stöder Out-of-source bygger — så all vår sammanställd kod går in i en katalog separat till källorna.

för att starta en byggnad skapar vi en ny mapp:

mkdir _build
cd _build

och ring cmake med sökvägen till projektets rot (i detta fall den överordnade mappen):

cmake ..

detta kommer att generera byggskript med standardgeneratorn — på Linux / OSX bör detta vara makefiler.

som standard kommer cmake att installera vår build i systemkatalogerna.
för att definiera en anpassad installationskatalog skickar vi den helt enkelt till cmake:

cmake .. -DCMAKE_INSTALL_PREFIX=../_install

för att köra byggskriptet kan du helt enkelt använda Makefile:

make
make install

Vi kan nu köra vår binära från installationskatalogen:

../_install/bin/myapp

om vi ville använda en annan generator skickar vi den till cmake med -G parameter:

cmake .. -GXcode

detta kommer att mata ut ett lätt konfigurerat Xcode-projekt för att bygga vår app.

använda cmake med bibliotek

för att bygga ett bibliotek använder vi ett liknande 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 kommer att bygga biblioteket som libtest.a och installera det i lib-mappen i installationskatalogen.
vi inkluderar också vår offentliga rubrikfil i installationssteget och berättar för cmake att lägga den i include.

istället för ett statiskt bibliotek kan vi också bygga en delad lib:

add_library(test SHARED test.c)

länka bibliotek till körbara filer med CMake

Vi kan utöka vår körbara från ovan genom att länka den till vår libray libtest.a.

låt oss börja med att lägga till bibliotekets katalog som en underkatalog till vårt myapp-projekt.

Nu kan vi använda biblioteket definierat 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 gör biblioteket test definierat i libtestproject tillgängligt för build.
i target_link_libraries vi ber CMake att länka den till vår körbara. CMake kommer att se till att först bygga test innan du länkar det till myapp.

inklusive externa bibliotek som använder andra byggsystem

medan CMake har ökat intresse finns det fortfarande gott om bibliotek som använder inbyggda byggsystem som Unix Makefiles. Du kan använda dem i ditt cmake-projekt utan att behöva skriva om sina byggskript.

allt vi behöver är cmakes stöd för externa projekt och importerade bibliotek:

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 tillåter oss att lägga till ett externt projekt som mål för vårt projekt. Om du inte anger kommandon som BUILD_COMMAND eller INSTALL_COMMAND, letar CMake efter ett CMakeLists.txt I det externa projektet och kör det.
i vårt fall vill vi använda luajit-biblioteket som är byggt med en Makefile.

add_library stöder import av redan byggda bibliotek också – vi måste bara ställa in egenskapenIMPORTED_LOCATION.
Calling ExternalProject_Add anger bara det externa projektet som ett mål men bygger det inte automatiskt. Det kommer bara att byggas om vi lägger till ett beroende av det. Vi kallar därför add_dependencies för att göra vårt importerade bibliotek beroende av det externa projektet.

slutligen kan vi länka vårt importerade bibliotek precis som ett” normalt”bibliotek med target_link_libraries.

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *