CMake ビルドプロセス

CMake のビルドプロセスは、ビルドディレクトリの作成からコンパイルの実行、さらにクリーンアップと再設定まで、いくつかの主要なステップに分かれています。

プロセス全体は CMakeLists.txt 設定ファイルを中心に展開され、CMake は設定を読み取った後、現在のプラットフォームに適したビルドファイルを生成します。


ビルドプロセス概要

完全な CMake ビルドプロセスには以下の5つの重要なステップが含まれており、各ステップには特定の役割とコマンドがあります。

ステップ 操作 コマンド 説明
1 ビルドディレクトリの作成 mkdir build && cd build Out-of-source 方式を使用し、ソースディレクトリを清潔に保つ
2 ビルドファイルの生成 cmake .. CMakeLists.txt を読み取り、Makefile / Ninja / .sln などを生成する
3 コンパイルとビルド cmake --build . 実際のコンパイルとリンクのプロセスを実行する
4 ビルドファイルのクリーンアップ cmake --build . --target clean コンパイルで生成された中間ファイルとオブジェクトファイルを削除する
5 再設定とビルド cmake .. && cmake --build . CMakeLists.txt 変更後に再生成してコンパイルする

CMake 构建流程图


ビルドプロセスの詳細

以下で、各ステップの具体的な操作と一般的なオプションを詳しく説明します。

ビルドディレクトリの作成

CMake は以下の使用を推奨していますOut-of-source(ソースコード外)ビルド方式、つまりビルドファイルをソースコードディレクトリの外にある独立したディレクトリに配置する方式です。

この方式によりソースコードディレクトリを清潔に保ちながら、同じソースコードで複数の異なるビルド構成(Debug と Release の併存など)をサポートできます。

常に Out-of-source ビルド方式を使用してください。ソースディレクトリ内で直接 cmake を実行するとプロジェクト構造が汚染され、生成された中間ファイルのクリーンアップが困難になり、ビルドタイプの切り替えも不便になります。

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

ビルドディレクトリを作成:

# 在项目根目录下创建 build 目录
mkdir build

ビルドディレクトリへ移動:

# 切换到构建目录,后续所有 cmake 命令在此执行
cd build

ビルドファイルの生成

ビルドディレクトリ内で CMake を実行し、ソースコードディレクトリ内の CMakeLists.txt を読み取って、現在のプラットフォームに適したビルドシステムファイルを生成します。

CMake は、Unix Makefiles、Ninja、Visual Studio、Xcode など、複数のビルドシステムジェネレーターをサポートしています。

基本的な使用方法——デフォルトのビルドファイルを生成:

# .. 指向包含 CMakeLists.txt 的源代码目录
cmake ..

ジェネレーターを指定:

使用する-Gパラメータで、生成するビルドシステムの種類を指定できます。

# 使用 Ninja 作为构建系统(速度比 Make 更快)
cmake -G "Ninja" ..

ビルドタイプを指定:

使用する-DCMAKE_BUILD_TYPEパラメータでコンパイルの最適化レベルとデバッグ情報を設定します。

# 四种常见的构建类型:Debug / Release / RelWithDebInfo / MinSizeRel
cmake -DCMAKE_BUILD_TYPE=Release ..

設定結果の確認:

CMake は、検出されたコンパイラ、見つかったライブラリ、定義されたオプションなど、設定プロセス中の詳細情報を出力します。

エラーがなければ、ビルドシステムファイルは現在のビルドディレクトリに生成されます。

設定プロセス中にエラーが発生した場合(指定したライブラリが見つからないなど)、CMake は中止してエラーメッセージを出力します。エラーを解決した後、cmake コマンドを再実行すれば続行できます。

コンパイルとビルド

ビルドファイルが生成されたら、実際のコンパイルとリンクのプロセスを実行できます。

ビルドシステムによって使用するコンパイルコマンドが異なりますが、CMake が提供する汎用ビルドコマンドを使用することもできます。

推奨方法——CMake 汎用ビルドコマンドを使用:

# 无论底层使用哪种构建系统,该命令都能正确编译
cmake --build .

特定のターゲットをビルド:

# 只编译指定的目标(如某个可执行文件或库)
cmake --build . --target MyExecutable

Makefile ビルドシステムを使用:

# 编译所有目标
make

# 使用多核并行编译(-j 参数指定并行任务数)
make -j$(nproc)

# 编译特定目标
make MyExecutable

Ninja ビルドシステムを使用:

# Ninja 自动并行编译,无需手动指定 -j
ninja

# 编译特定目标
ninja MyExecutable

Visual Studio を使用:

Visual Studio プロジェクトファイルが生成された場合、.slnソリューションファイルを開き、IDE でソリューションのビルドを選択します。

# 也可以使用 MSBuild 命令行工具编译
msbuild MyProject.sln /p:Configuration=Release

ビルドファイルのクリーンアップ

ビルドプロセス中に生成された中間ファイル(.o、.obj など)やオブジェクトファイルは、クリーンアップ操作で削除してディスク容量を解放できます。

CMake 汎用クリーンアップコマンドを使用:

cmake --build . --target clean

Makefile を使用:

make clean

Ninja を使用:

ninja clean

手動クリーンアップ:

# 删除构建目录中的所有文件,保留源代码目录不变
rm -rf build/*

最も簡単で確実なクリーンアップ方法は、build ディレクトリ全体を直接削除してから、再作成して cmake を実行することです。これは clean ターゲットが正しく定義されていない可能性があるため、clean を単独で実行するよりも信頼性が高いです。

再設定とビルド

CMakeLists.txt ファイルを変更したりプロジェクト設定を調整したりした場合は、CMake 設定を再実行して再コンパイルする必要があります。

再設定:

# CMake 会自动检测变更的文件,只重新生成受影响的部分
cmake ..

再コンパイル:

# 编译系统会自动识别哪些源文件发生了变更,只重新编译改动的部分
cmake --build .

ほとんどの場合、CMakeLists.txt を変更した後、cmake --build . を直接実行するだけで十分です。ビルドシステムは CMakeLists.txt の変更を自動的に検出し、cmake 設定ステップを再実行します。


ビルドシステムの比較

CMake は複数のビルドシステムファイルの生成をサポートしています。以下は、最もよく使われる3つのビルドシステムの比較です。

ビルドシステム 対応プラットフォーム 並列コンパイル 特徴
Unix Makefiles Linux / macOS 手動指定が必要-j 互換性が最も広く、ほぼすべての Unix システムに標準搭載
Ninja クロスプラットフォーム 自動並列 速度が速く、特にインクリメンタルコンパイルや大規模プロジェクトに適している
Visual Studio Windows IDE が自動管理 VS IDE と深く統合されており、グラフィカルなデバッグと設定をサポート

注意事項

常に Out-of-source ビルドを使用してください。ソースディレクトリ内で cmake を実行すると大量の中間ファイルが生成され、バージョン管理を汚染します。build ディレクトリを .gitignore に追加することがベストプラクティスです。

cmake --build . コマンドを優先的に使用してください。このコマンドはクロスプラットフォームの汎用ビルドエントリであり、基盤が Make、Ninja、MSBuild のいずれでも正しく動作します。スクリプトや CI 環境での使用に特に推奨されます。

ビルドタイプはパフォーマンスとデバッグ体験に影響します。Debug モードにはデバッグシンボルが含まれ最適化されないため、開発に適しています。Release モードは最適化が有効でデバッグ情報が削除されるため、本番デプロイに適しています。Debug モードでパフォーマンスをテストしたり、Release モードでコードをデバッグしたりしないでください。

原因不明のビルドエラーが発生した場合は、build ディレクトリを削除してやり直してください。CMake のキャッシュは、期限切れの設定情報を保持することがあり、調査が困難なエラーの原因となることがあります。build ディレクトリ全体を削除して cmake を再実行するのが最も迅速な調査方法です。

その他の拡張