CMake 构建流程

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:直接 makemake -j8
  • 如果生成的是 Ninja:直接 ninjaninja -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++ 项目。接下来可以学习更高级的话题,如子目录管理、外部库集成、交叉编译等。

如果你想看某个具体场景的完整构建脚本(例如带测试 + 安装 + 多目标的项目),随时告诉我!

文章已创建 3511

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部