现在位置: 首页 > CMake 教程 > 正文

CMake 构建流程

CMake 的构建流程分为几个主要步骤,从创建构建目录到执行编译,再到清理和重新配置。

整个过程围绕 CMakeLists.txt 配置文件展开,CMake 读取配置后生成适合当前平台的构建文件。


构建流程概览

一个完整的 CMake 构建流程包含以下五个关键步骤,每一步都有其特定的作用和命令。

步骤 操作 命令 说明
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 支持生成多种构建系统文件,以下是三种最常用构建系统的对比。

构建系统 适用平台 并行编译 特点
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 是最快的排查方式。