CMake 构建流程详解
CMake 的构建过程分为两个主要阶段:配置阶段(Configure) 和 构建阶段(Build),可选还有测试阶段(Test) 和 安装阶段(Install)。理解这个流程是掌握 CMake 的关键。
完整构建流程图解
源码目录 (含 CMakeLists.txt)
│
▼
mkdir build ← 创建独立的构建目录(强烈推荐!)
│
▼
cd build
│
▼
cmake [选项] <源码路径> ← 配置阶段:生成构建系统
│
▼
cmake --build . [选项] ← 构建阶段:真正编译、链接
│
▼(可选)
ctest . ← 测试阶段:运行单元测试
│
▼(可选)
cmake --install . ← 安装阶段:安装到指定路径
1. 配置阶段(Configure) – cmake ..
作用:读取所有 CMakeLists.txt,检查环境、编译器、依赖,生成平台原生的构建脚本(如 Makefile、Ninja 文件、Visual Studio 项目等)。
常用命令示例:
cd build
cmake .. # 最简单,使用默认设置
cmake .. -DCMAKE_BUILD_TYPE=Release # 指定 Release 模式(优化)
cmake .. -DCMAKE_BUILD_TYPE=Debug # Debug 模式(带调试信息)
cmake .. -G "Ninja" # 使用 Ninja 生成器(更快)
cmake .. -DCMAKE_CXX_STANDARD=20 # 指定 C++20
cmake .. -S . -B . # 显式指定源码目录(S)和构建目录(B),CMake 3.13+
这一步会生成的文件(在 build 目录):
CMakeCache.txt:缓存配置变量(下次运行可复用)CMakeFiles/:中间文件- Makefile / cmake_install.cmake / *.sln(取决于生成器)
提示:如果修改了 CMakeLists.txt,只需重新运行 cmake .. 即可更新配置。
2. 构建阶段(Build) – cmake --build .
作用:调用底层工具(make、ninja、msbuild 等)实际编译源码、生成可执行文件或库。
常用命令示例:
cmake --build . # 默认构建所有目标
cmake --build . --target myapp # 只构建指定目标 myapp
cmake --build . --config Release # 多配置生成器(如 VS)指定配置
cmake --build . -j8 # 并行编译,使用 8 个线程(推荐)
cmake --build . --clean-first # 先清理再构建
等价的旧方式(仍广泛使用):
- 如果生成的是 Makefile:直接
make或make -j8 - 如果生成的是 Ninja:直接
ninja或ninja -j8
3. 测试阶段(Test) – ctest
前提:在 CMakeLists.txt 中使用 add_test() 定义测试。
常用命令:
ctest # 运行所有测试
ctest -V # 详细输出
ctest -R "login" # 只运行名称包含 login 的测试
ctest --output-on-failure # 只在失败时显示输出
4. 安装阶段(Install) – cmake --install
前提:在 CMakeLists.txt 中使用 install() 命令定义安装规则。
常用命令:
cmake --install . # 安装到默认路径(通常 /usr/local)
cmake --install . --prefix /opt/myapp # 指定安装前缀
sudo cmake --install . # 系统级安装常需要管理员权限
推荐的完整标准流程脚本(跨平台)
#!/bin/bash
set -e # 任意错误即退出
rm -rf build # (可选)彻底清理
mkdir build && cd build
cmake .. \
-DCMAKE_BUILD_TYPE=Release \
-DCMAKE_CXX_STANDARD=17 \
-G "Ninja" # 可选,使用 Ninja 更快
cmake --build . -j$(nproc) # 并行构建,使用所有 CPU 核心
ctest -j$(nproc) --output-on-failure # (可选)运行测试
sudo cmake --install . --prefix /usr/local # (可选)系统安装
常见问题与技巧
| 问题 | 解决方案 |
|---|---|
| 配置太慢 | 使用 Ninja 生成器:cmake -G "Ninja" .. |
| 想切换 Debug/Release | 单配置(Makefile/Ninja):删除 build 目录重新配置 多配置(VS):用 --config Debug/Release |
| 修改 CMakeLists.txt 后没生效 | 重新运行 cmake .. |
| 想彻底清理 | 删除整个 build 目录(最干净) |
| IDE 中使用 | VS/CLion/Qt Creator 等会自动管理以上流程 |
掌握这个构建流程后,你就能高效、可靠地管理任何规模的 C++ 项目。接下来可以学习更高级的话题,如子目录管理、外部库集成、交叉编译等。
如果你想看某个具体场景的完整构建脚本(例如带测试 + 安装 + 多目标的项目),随时告诉我!