Dies ist eine alte Version des Dokuments!
Um CMake zu ermöglichen unser Projekt zu bauen müssen wir beschreiben wie unser Projekt übersetzt werden muss. Dazu erstellen wir eine Datei mit dem Namen CMakeLists.txt und beschreiben in einer für CMake verständlichen Skriptsprache, alle benötigten Aspekte unseres Programms. Für ein einfache Hello-World Programm (einzige Quelldatei ist main.c) kann diese Datei zum Beispiel so ausschauen:
cmake_minimum_required(VERSION 3.10) project(HelloWorld) add_executable(hello_world main.c)
Der Vorgang das Projekt nun zu übersetzen besteht aus zwei Schritten:
Andere Ziele (bspw. Visual Studio Projektdateien) anstelle von Makefiles sind ebenfalls vorhanden.
Dieses Projekt bauen wir wie folgt. Üblicherweise erstellen wir uns im Projektordner einen neuen Ordner build. Dort wechseln wir hinein und führen das CMake-Programm aus:
cmake ..
CMake sucht nun im übergeordneten Verzeichnis (..) nach einer CMakeLists.txt, interpretiert sie, und legt eine Makefile an, die das Projekt entsprechend kompilieren soll. Wenn alles gut läuft, könnte die Ausgabe von CMake folgendermaßen aussehen:
-- The C compiler identification is GNU 12.1.0 -- The CXX compiler identification is GNU 12.1.0 -- Detecting C compiler ABI info -- Detecting C compiler ABI info - done -- Check for working C compiler: /usr/bin/cc - skipped -- Detecting C compile features -- Detecting C compile features - done -- Detecting CXX compiler ABI info -- Detecting CXX compiler ABI info - done -- Check for working CXX compiler: /usr/bin/c++ - skipped -- Detecting CXX compile features -- Detecting CXX compile features - done -- Configuring done -- Generating done -- Build files have been written to: /home/naums/test/build
Hier wird der C-Compiler erkannt (GCC 12.1.0), ein paar Compilerfeatures probiert und am Ende das Projekt konfiguriert und ein Makefile generiert. Das build-Verzeichnis sieht nun so aus:
$ ls 🗋 cmake_install.cmake 🗋 CMakeCache.txt 🗁 CMakeFiles 🗋 Makefile
Nun führen wir das Makefile normal aus, womit das Projekt übersetzt und gelinkt wird, und wir erhalten eine hello_world Executable.
file(GLOB C_FILES "*.cpp") file(GLOB H_FILES "../../include/foo/*.h")
find_package(Qt4 REQUIRED)
target_link_libraries(foo ${QT_LIBRARIES})