在 CMake 跨平台工作流中,cmake ..(生成构建系统)和 cmake --build .(执行构建)是最核心的两个跨平台命令,它们抽象了不同平台的构建工具(如 Linux 的 make、Windows 的 msbuild、macOS 的 xcodebuild 等)。以下是围绕「配置→构建→测试→安装→打包→清理」全流程的跨平台命令集合,覆盖常见场景:
一、配置阶段:生成构建系统(对应 cmake ..)
作用:在构建目录(如 build)中生成平台对应的构建文件(Makefile、VS 项目、Xcode 工程等),是跨平台构建的第一步。
| 命令 | 用途 | 示例 |
|---|---|---|
cmake <source_dir> |
基础配置:生成构建系统文件 | 1. 在源码目录外创建 build 目录并进入:mkdir build && cd build2. 指向源码目录( .. 表示父目录为源码根目录):cmake .. |
cmake <source_dir> -DCMAKE_BUILD_TYPE=<type> |
指定构建类型(单配置生成器) | cmake .. -DCMAKE_BUILD_TYPE=Release # 生成 Release 模式的 Makefile |
cmake <source_dir> -DCMAKE_INSTALL_PREFIX=<path> |
指定默认安装路径 | cmake .. -DCMAKE_INSTALL_PREFIX=/opt/myapp # 安装到 /opt/myapp(Linux/macOS) |
cmake <source_dir> -G <generator> |
手动指定生成器(可选) | cmake .. -G Ninja # 用 Ninja 生成构建文件(需先安装 Ninja) |
cmake <source_dir> -D<var>=<value> |
传递自定义变量 | cmake .. -DBUILD_TESTS=ON -DBUILD_STATIC=OFF # 启用测试,禁用静态库 |
二、构建阶段:编译代码(对应 cmake --build .)
作用:执行实际编译,生成可执行文件/库,替代平台特定命令(make、msbuild、xcodebuild 等),跨平台统一语法。
| 命令 | 用途 | 示例 |
|---|---|---|
cmake --build <build_dir> |
基础构建:编译所有目标 | 在 build 目录中执行:cmake --build . # 编译所有目标 |
cmake --build <build_dir> --target <target> |
构建指定目标 | cmake --build . --target MyApp # 仅编译 MyApp 可执行文件 |
cmake --build <build_dir> --config <type> |
指定构建类型(多配置生成器) | cmake --build . --config Release # VS/Xcode 生成 Release 版本 |
cmake --build <build_dir> --parallel <N> |
并行编译(加速) | cmake --build . --parallel 8 # 8 线程并行编译cmake --build . -j 8 # 简写形式 |
cmake --build <build_dir> --clean-first |
先清理再构建 | cmake --build . --clean-first --config Debug # 清理后重新编译 Debug 版本 |
三、测试阶段:运行测试(跨平台替代 ctest 直接调用)
CMake 集成 CTest 作为跨平台测试工具,替代手动运行测试程序,统一测试命令。
| 命令 | 用途 | 示例 |
|---|---|---|
ctest |
运行所有测试 | 在 build 目录中执行:ctest # 运行所有测试 |
ctest -C <config> |
指定测试配置(多配置生成器) | ctest -C Release # 运行 Release 版本的测试 |
ctest -R <regex> |
运行匹配名称的测试 | ctest -R utils # 运行名称含 “utils” 的测试 |
ctest -j <N> |
并行运行测试 | ctest -j 4 # 4 个测试并行运行 |
ctest --output-on-failure |
测试失败时显示输出 | ctest --output-on-failure -C Debug # Debug 测试失败时显示日志 |
四、安装阶段:部署文件(跨平台替代 make install)
作用:将编译好的目标(可执行文件、库、头文件等)安装到指定路径,替代平台特定的安装命令(make install、msbuild INSTALL.vcxproj 等)。
| 命令 | 用途 | 示例 |
|---|---|---|
cmake --install <build_dir> |
基础安装:按规则部署文件 | 在 build 目录中执行:cmake --install . # 安装到默认前缀(如 /usr/local) |
cmake --install <build_dir> --prefix <path> |
自定义安装路径 | cmake --install . --prefix ~/myapp # 安装到用户目录(Linux/macOS)cmake --install . --prefix C:\myapp # Windows 安装路径 |
cmake --install <build_dir> --config <type> |
指定安装配置(多配置生成器) | cmake --install . --config Release --prefix /opt/myapp # 安装 Release 版本到 /opt |
cmake --install <build_dir> --component <component> |
安装指定组件 | cmake --install . --component runtime # 仅安装运行时组件(可执行文件/动态库) |
五、打包阶段:生成安装包(跨平台替代 make package)
通过 CPack 生成跨平台安装包(如 .exe、.deb、.dmg 等),统一打包命令。
| 命令 | 用途 | 示例 |
|---|---|---|
cmake --build <build_dir> --target package |
构建后直接打包 | cmake --build . --target package --config Release # 生成 Release 版本安装包 |
cpack |
直接打包(需先构建) | 在 build 目录中执行:cpack -C Release # 生成 Release 安装包 |
cpack -G <generator> |
指定打包生成器 | cpack -G ZIP # 生成跨平台 ZIP 压缩包cpack -G DEB -C Release # Linux 生成 DEB 包 |
六、清理阶段:删除构建产物(跨平台替代 make clean)
作用:删除编译生成的中间文件和目标文件,保持构建目录干净。
| 命令 | 用途 | 跨平台说明 | 示例 |
|---|---|---|---|
cmake --build <build_dir> --target clean |
清理构建产物 | 替代 make clean、msbuild /t:Clean 等,跨平台统一清理命令。 |
cmake --build . --target clean # 清理所有构建产物 |
rm -rf <build_dir>/*(Linux/macOS)del /f/s/q <build_dir>\*(Windows cmd) |
彻底清理构建目录 | 若清理不彻底(如缓存文件),可直接删除构建目录内容后重新配置。 | Linux/macOS:cd build && rm -rf *Windows cmd: cd build && del /f/s/q * |
跨平台命令优势总结
这些命令的核心价值是屏蔽平台差异:
-
无需记忆
make(Linux)、msbuild(Windows)、xcodebuild(macOS)等工具的语法; -
同一套命令可在所有系统上运行(如
cmake --build . -j 8在任何平台都表示 8 线程编译); -
通过选项(如
--config、--prefix)灵活适配不同场景,无需修改 CMakeLists.txt。
实际工作流示例(跨平台通用):
1 | # 1. 创建并进入构建目录 |