CMake – der Standard-Build-Generator für C und C++

CMake ist kein Compiler, sondern ein Build-System-Generator: Aus einer plattformunabhängigen Beschreibung (CMakeLists.txt) erzeugt es Makefiles, Ninja-Dateien oder Projektdateien für Visual Studio und Xcode. Damit lässt sich derselbe Quellcode auf Linux, macOS und Windows bauen – die Grundlage fast aller großen C/C++-Projekte, von LLVM bis zu Qt.

Die wichtigsten CMake-Befehle

  • cmake -S . -B build – konfiguriert das Projekt: Quellverzeichnis -S, Build-Verzeichnis -B.
  • cmake --build build – baut das Projekt im konfigurierten Verzeichnis.
  • cmake --build build --target install – baut und installiert ein Ziel.
  • cmake -DCMAKE_BUILD_TYPE=Release -S . -B build – setzt Konfigurationsvariablen.
  • cmake -G Ninja -S . -B build – wählt den Generator (hier Ninja, deutlich schneller als Make).
  • ctest --test-dir build – führt registrierte Tests aus.
  • cpack – erzeugt Installationspakete (deb, rpm, zip, DMG).
  • cmake --install build --prefix /usr/local – installiert ohne Build-Schritt.

Minimales CMakeLists.txt

cmake_minimum_required(VERSION 3.20)
project(HalloWelt C)

add_executable(hallo main.c)
target_compile_features(hallo PRIVATE c_std_11)
  • cmake_minimum_required – legt die minimale CMake-Version fest.
  • project – Projektname und Sprachen (C, CXX, Fortran …).
  • add_executable / add_library – definiert Build-Ziele.
  • target_link_libraries – verknüpft Ziele und Bibliotheken.
  • find_package – findet externe Pakete (z. B. find_package(OpenSSL REQUIRED)).

Praxis-Tipps

  • Out-of-Source-Builds: Immer in ein separates build/-Verzeichnis bauen – nie im Quellbaum. Aufräumen = rm -rf build.
  • Presets: CMakePresets.json speichert häufige Konfigurationen (cmake --preset release).
  • Ninja: Der Generator Ninja baut parallel und ist deutlich schneller als Make – Standard bei modernen Projekten.
  • Cache: cmake --build build --target help zeigt alle Ziele; cmake-gui bietet eine grafische Konfigurationsoberfläche.

Weiterführend: C und C++: Schnellreferenz und Kompilieren einfach erklärt.