Projekte mit CMake bauen
CMake ist ein Werkzeug zur Beschreibung und Erzeugung eines Builds. Es ist selbst kein C++-Compiler. Ein Generator wählt das zugrunde liegende Buildsystem, etwa Ninja oder Visual-Studio-Projektdateien. Ein Target ist ein benanntes Buildziel, beispielsweise ein Programm oder eine Bibliothek.
Projekte mit CMake bauen#
Dateien, Fehler und Werkzeuge · Lektion 53 von 60
Voraussetzungen: Mehrere Dateien, Tests. Lernziel: Du beschreibst Compilerziele und Sprachversion zentral.
CMake ist ein Werkzeug zur Beschreibung und Erzeugung eines Builds. Es ist selbst kein C++-Compiler. Ein Generator wählt das zugrunde liegende Buildsystem, etwa Ninja oder Visual-Studio-Projektdateien. Ein Target ist ein benanntes Buildziel, beispielsweise ein Programm oder eine Bibliothek.
Für die drei Dateien aus Header legst du daneben eine Datei CMakeLists.txt an:
1cmake_minimum_required(VERSION 3.20)2project(Rechner LANGUAGES CXX)3 4add_executable(rechner main.cpp rechnen.cpp)5target_compile_features(rechner PRIVATE cxx_std_17)6set_target_properties(rechner PROPERTIES CXX_EXTENSIONS OFF)7 8if(MSVC)9 target_compile_options(rechner PRIVATE /W4 /permissive- /utf-8)10else()11 target_compile_options(rechner PRIVATE -Wall -Wextra -Wpedantic)12endif()CXX steht hier für C++. add_executable benennt das Programm und seine Quelldateien. target_compile_features fordert mindestens die entsprechende Sprachfähigkeit. PRIVATE bedeutet, dass diese Anforderung hier zum Ziel selbst gehört. Bei Bibliotheken können PUBLIC und INTERFACE Anforderungen gezielt an Benutzer weitergeben.
Konfigurieren und bauen#
1cmake -S . -B build2cmake --build build --config Debug-S bezeichnet den Quellordner, -B den Buildordner. Ein Out-of-source-Build hält erzeugte Dateien getrennt vom Quelltext. Dadurch bleiben Projekte übersichtlicher und verschiedene Konfigurationen leichter trennbar.
Bei Multi-Configuration-Generatoren wählst du die Konfiguration beim Build mit --config. Bei Single-Configuration-Generatoren setzt du sie üblicherweise bereits mit -DCMAKE_BUILD_TYPE=Debug beim Konfigurieren. Ein Debug- oder Release-Unterordner des Ergebnisses hängt deshalb vom Generator ab.
Tests registrieren#
Für ein vorhandenes eigenständiges Testprogramm kannst du mit enable_testing() und add_test(NAME ... COMMAND ...) einen Test bei CTest, dem Testläufer von CMake, registrieren. Starte ihn mit ctest --test-dir build -C Debug --output-on-failure. Das Testprogramm muss seinen Fehlschlag durch einen passenden Exitcode melden.
Typische Fehler#
No CMAKE_CXX_COMPILER could be found bedeutet, dass keine passende C++-Werkzeugkette gefunden wurde. Ein installierter Editor genügt nicht. Bei „undefined reference“ prüfe weiterhin, ob alle Implementierungsdateien im richtigen Target enthalten sind.
Das offizielle CMake-Tutorial vertieft Targets, Konfigurationen und Tests. Übertrage Einstellungen möglichst zielbezogen, statt globale Flags für jedes Projektteil anzuhäufen.
Übung#
Reicht es, rechnen.hpp zu add_executable hinzuzufügen, wenn rechnen.cpp fehlt?
Lösung
Nein. Der Header kann die Deklaration bereitstellen, aber die Funktionsdefinition aus rechnen.cpp muss ebenfalls übersetzt und verbunden werden.
Weiterlernen#
Zurück: Tests, assert und Grenzfälle · Kursübersicht · Weiter: Nebenläufigkeit, Threads und Datenrennen
Kommentare 0
Kommentare sind für diese Seite deaktiviert.