C++
VeröffentlichtRevision 1

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:

cmake
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#

Nur Text
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

Mitwirkende 1

Menschen, deren Änderungen in dieser Seite veröffentlicht wurden.

Kommentare 0

Kommentare sind für diese Seite deaktiviert.