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

CMake 构建流程图


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.

Out-of-source 构建方式示意图

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.

Wenn 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.

Weitere Erweiterungen