Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
|
build:cmake:create-project [2011/04/14 22:37] kerli angelegt |
build:cmake:create-project [2022/09/22 19:58] (aktuell) |
||
|---|---|---|---|
| Zeile 1: | Zeile 1: | ||
| ====== Ein Projekt anlegen ====== | ====== Ein Projekt anlegen ====== | ||
| - | ===== Ein erste Projekt ===== | + | 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: |
| - | Um CMake zu ermöglichen unser Projekt zu bauen müssen wir beschreiben wie unser Projekt überhaupt gebaut 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 kann diese Datei zum Beispiel so ausschauen: | + | <code cmake> |
| + | cmake_minimum_required(VERSION 3.10) | ||
| - | <code> | ||
| - | # Das ist ein Kommentar | ||
| - | # für das tolle Hello World Projekt | ||
| project(HelloWorld) | project(HelloWorld) | ||
| - | add_executable(hello_world main.cpp) | + | add_executable(hello_world main.c) |
| </code> | </code> | ||
| - | Anschließend können wir über die Konsole oder auch die GUI von CMake ein Projekt für die gewünschte Entwicklungsumgebung erstellen lassen und danach auch gleich bauen. | + | ===== Das Projekt bauen ===== |
| - | ===== Quelldateien angeben ===== | + | Der Vorgang das Projekt nun zu übersetzen besteht aus zwei Schritten: |
| + | - Erzeugen eines Makefiles mit Cmake | ||
| + | - Übersetzen des Projekts mithilfe des Makefiles | ||
| + | |||
| + | 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: | ||
| - | FIXME | ||
| <code> | <code> | ||
| - | file(GLOB C_FILES "*.cpp") | + | -- The C compiler identification is GNU 12.1.0 |
| - | file(GLOB H_FILES "../../include/foo/*.h") | + | -- 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 | ||
| </code> | </code> | ||
| - | ===== Bibliotheken finden und linken ===== | + | 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: |
| - | FIXME | + | $ ls |
| - | <code> | + | 🗋 cmake_install.cmake 🗋 CMakeCache.txt 🗁 CMakeFiles 🗋 Makefile |
| - | find_package(Qt4 REQUIRED) | + | |
| + | Nun führen wir das Makefile normal aus, womit das Projekt übersetzt und gelinkt wird, und wir erhalten eine ''hello_world'' Executable. | ||
| + | |||
| + | ===== Die CMakeLists verstehen ===== | ||
| + | |||
| + | Die obige ''CMakeLists.txt'' beinhaltet drei Kommandos: | ||
| + | |||
| + | <code cmake> | ||
| + | cmake_minimum_required(VERSION 3.10) | ||
| </code> | </code> | ||
| - | <code> | + | Dies gibt die minimale Version von CMake an, mit der dieses CMakefile benutzt werden kann. Das wird vor allem dann interessant, wenn Features aktuellerer CMake-Versionen gebraucht werden. Es bietet sich für persönliche Projekte an, einfach die Version des installierten CMakes zu verwenden, für Projekte mit anderen Entwickler\*innen, sollte sich auf die minimal vorhandene Version über die vorhandenen Linux-Systeme hinweg geeinigt werden. Damit sind aber auch einige der aktuelleren Features ausgeschlossen, weil die mit einem älteren CMake nicht funktionieren. |
| - | target_link_libraries(foo ${QT_LIBRARIES}) | + | |
| + | <code cmake> | ||
| + | project(HelloWorld) | ||
| </code> | </code> | ||
| + | |||
| + | Diese Zeile gibt dem Projekt einen beliebigen Projektnamen. | ||
| + | |||
| + | <code cmake> | ||
| + | add_executable(hello_world main.c) | ||
| + | </code> | ||
| + | |||
| + | Mit ''add_executable'' teilen wir CMake mit, dass wir eine ausführbare Datei erstellen wollen. Die hier nennen wir ''hello_world'' und sie wird aus der ''main.c'' erstellt. CMake weiß bereits, wie es aus einzelnen C-Dateien Programme erstellen kann, sodass es ausreicht CMake die benötigten Dateien mitzuteilen. | ||
| + | |||
| + | Dieses CMake-Projekt ist nicht sonderlich spannend, aber CMake kann noch ziemlich nützlich werden. | ||