CMake-Build-Prozess
Der CMake-Build-Prozess gliedert sich in mehrere Hauptschritte: vom Anlegen eines Build-Verzeichnisses über die Ausführung der Kompilierung bis hin zur Bereinigung und Neukonfiguration.
Der gesamte Prozess dreht sich um die Konfigurationsdatei CMakeLists.txt. Nach dem Einlesen der Konfiguration generiert CMake Build-Dateien, die für die aktuelle Plattform geeignet sind.
Überblick über den Build-Prozess
Ein vollständiger CMake-Build-Prozess umfasst die folgenden fünf Schlüsselschritte, wobei jeder Schritt seinen spezifischen Zweck und seine eigenen Befehle hat.
| Schritt | Aktion | Befehl | Beschreibung |
|---|---|---|---|
| 1 | Build-Verzeichnis erstellen | mkdir build && cd build |
Verwenden Sie die Out-of-source-Methode, um das Quellverzeichnis sauber zu halten |
| 2 | Build-Dateien generieren | cmake .. |
CMakeLists.txt einlesen, Makefile / Ninja / .sln usw. generieren |
| 3 | Kompilieren und Bauen | cmake --build . |
Den eigentlichen Kompilierungs- und Linkvorgang ausführen |
| 4 | Build-Dateien bereinigen | cmake --build . --target clean |
Zwischendateien und während der Kompilierung erzeugte Objektdateien löschen |
| 5 | Neu konfigurieren und bauen | cmake .. && cmake --build . |
Nach Änderungen an CMakeLists.txt neu generieren und neu kompilieren |

Detaillierter Build-Prozess
Im Folgenden werden die konkreten Operationen und gängigen Optionen für jeden Schritt beschrieben.
Build-Verzeichnis erstellen
CMake empfiehlt die Verwendung derOut-of-source(out-of-source)-Build-Methode, d. h. das Platzieren von Build-Dateien in einem separaten Verzeichnis außerhalb des Quellcodeverzeichnisses.
Dieser Ansatz hält das Quellverzeichnis sauber und unterstützt gleichzeitig mehrere verschiedene Build-Konfigurationen aus demselben Quellcode (wie koexistierende Debug- und Release-Konfigurationen).
Verwenden Sie immer die Out-of-source-Build-Methode. Das direkte Ausführen von cmake im Quellverzeichnis verschmutzt die Projektstruktur, wodurch generierte Zwischendateien schwer zu bereinigen sind und der Wechsel zwischen Build-Typen unbequem wird.

Build-Verzeichnis erstellen:
# 在项目根目录下创建 build 目录 mkdir build
In das Build-Verzeichnis wechseln:
# 切换到构建目录,后续所有 cmake 命令在此执行 cd build
Build-Dateien generieren
CMake im Build-Verzeichnis ausführen, die CMakeLists.txt im Quellverzeichnis einlesen und Build-Systemdateien generieren, die für die aktuelle Plattform geeignet sind.
CMake unterstützt mehrere Build-System-Generatoren wie Unix Makefiles, Ninja, Visual Studio, Xcode usw.
Grundlegende Verwendung — Standard-Build-Dateien generieren:
# .. 指向包含 CMakeLists.txt 的源代码目录 cmake ..
Generator angeben:
Verwenden Sie-G. Der Parameter kann den Typ des zu generierenden Build-Systems angeben.
# 使用 Ninja 作为构建系统(速度比 Make 更快) cmake -G "Ninja" ..
Build-Typ angeben:
Verwenden Sie-DCMAKE_BUILD_TYPE. Der Parameter legt die Optimierungsstufe der Kompilierung und Debug-Informationen fest.
# 四种常见的构建类型:Debug / Release / RelWithDebInfo / MinSizeRel cmake -DCMAKE_BUILD_TYPE=Release ..
Konfigurationsergebnis prüfen:
CMake gibt während der Konfiguration detaillierte Informationen aus, einschließlich des erkannten Compilers, gefundener Bibliotheken, definierter Optionen usw.
Wenn keine Fehler auftreten, werden die Build-System-Dateien im aktuellen Build-Verzeichnis generiert.
Wenn während der Konfiguration ein Fehler auftritt (z. B. wenn eine angegebene Bibliothek nicht gefunden werden kann), bricht CMake ab und gibt eine Fehlermeldung aus. Nach Behebung des Fehlers führen Sie den cmake-Befehl erneut aus, um fortzufahren.
Kompilieren und Bauen
Sobald die Build-Dateien generiert wurden, kann der eigentliche Kompilierungs- und Linkvorgang ausgeführt werden.
Verschiedene Build-Systeme verwenden unterschiedliche Kompilierungsbefehle; Sie können auch den von CMake bereitgestellten generischen Build-Befehl verwenden.
Empfohlene Methode — den generischen Build-Befehl von CMake verwenden:
# 无论底层使用哪种构建系统,该命令都能正确编译 cmake --build .
Ein bestimmtes Ziel bauen:
# 只编译指定的目标(如某个可执行文件或库) cmake --build . --target MyExecutable
Verwendung des Makefile-Build-Systems:
# 编译所有目标 make # 使用多核并行编译(-j 参数指定并行任务数) make -j$(nproc) # 编译特定目标 make MyExecutable
Verwendung des Ninja-Build-Systems:
# Ninja 自动并行编译,无需手动指定 -j ninja # 编译特定目标 ninja MyExecutable
Verwendung von Visual Studio:
Wenn eine Visual Studio-Projektdatei generiert wird, können Sie die Projektmappendatei.slnöffnen und in der IDE Build Solution auswählen.
# 也可以使用 MSBuild 命令行工具编译 msbuild MyProject.sln /p:Configuration=Release
Build-Dateien bereinigen
Zwischendateien (.o, .obj usw.) und während des Build-Prozesses erzeugte Objektdateien können durch die clean-Operation gelöscht werden, um Speicherplatz freizugeben.
Verwenden Sie den generischen clean-Befehl von CMake:
cmake --build . --target clean
Verwendung von Makefile:
make clean
Verwendung von Ninja:
ninja clean
Manuelle Bereinigung:
# 删除构建目录中的所有文件,保留源代码目录不变 rm -rf build/*
Die einfachste und gründlichste Methode zum Bereinigen besteht darin, das gesamte Build-Verzeichnis zu löschen, es dann neu zu erstellen und cmake auszuführen. Dies ist zuverlässiger als nur clean auszuführen, da das clean-Ziel möglicherweise nicht korrekt definiert ist.
Neu konfigurieren und bauen
Nachdem Sie die Datei CMakeLists.txt geändert oder Projekteinstellungen angepasst haben, müssen Sie die CMake-Konfiguration erneut ausführen und neu kompilieren.
Rekonfigurieren:
# CMake 会自动检测变更的文件,只重新生成受影响的部分 cmake ..
Rekompilieren:
# 编译系统会自动识别哪些源文件发生了变更,只重新编译改动的部分 cmake --build .
In den meisten Fällen können Sie nach dem Ändern von CMakeLists.txt einfach cmake --build . ausführen. Das Build-System erkennt Änderungen an CMakeLists.txt automatisch und führt den cmake-Konfigurationsschritt erneut aus.
Vergleich der Build-Systeme
CMake kann verschiedene Arten von Build-System-Dateien generieren. Nachfolgend finden Sie einen Vergleich der drei am häufigsten verwendeten Build-Systeme.
| Build-System | Unterstützte Plattformen | Parallele Kompilierung | Funktionen |
|---|---|---|---|
| Unix Makefiles | Linux / macOS | Manuelle Spezifikation erforderlich-j |
Breiteste Kompatibilität; in fast allen Unix-Systemen integriert |
| Ninja | Plattformübergreifend | Automatische Parallelisierung | Höhere Geschwindigkeit, besonders geeignet für inkrementelle Kompilierung und große Projekte |
| Visual Studio | Windows | Automatische IDE-Verwaltung | Tiefe Integration in die VS-IDE, mit Unterstützung für grafisches Debuggen und Konfigurieren |
Hinweise
Verwenden Sie immer einen Out-of-Source-Build.Das Ausführen von cmake im Quellverzeichnis erzeugt viele Zwischendateien und verunreinigt die Versionskontrolle. Das Hinzufügen des Build-Verzeichnisses zu .gitignore ist eine bewährte Vorgehensweise.
Bevorzugen Sie den Befehl cmake --build .Dieser Befehl ist ein plattformübergreifender universeller Build-Einstiegspunkt und funktioniert korrekt, unabhängig davon, ob das zugrunde liegende System Make, Ninja oder MSBuild ist. Er wird besonders in Skripten und CI-Umgebungen empfohlen.
Der Build-Typ beeinflusst die Leistung und das Debugging-Erlebnis.Der Debug-Modus enthält Debug-Symbole und keine Optimierung, geeignet für die Entwicklung; der Release-Modus aktiviert die Optimierung und entfernt Debug-Informationen, geeignet für die Produktionsbereitstellung. Verwenden Sie den Debug-Modus nicht für Leistungstests und den Release-Modus nicht zum Debuggen von Code.
Weitere ErweiterungenWenn seltsame Build-Fehler auftreten, löschen Sie das Build-Verzeichnis und beginnen Sie von vorn.Der Cache von CMake kann manchmal veraltete Konfigurationsinformationen behalten, was zu Fehlern führt, die schwer zu diagnostizieren sind. Das Löschen des gesamten Build-Verzeichnisses und erneutes Ausführen von cmake ist der schnellste Weg zur Fehlerbehebung.