『CMake』关于使用CMake构建项目时的现代/传统指令
写在前面
最近才注意到使用CMake构建和编译项目时,使用的指令存在传统和现代两种写法,记录一下以备不时之需
概述
两种写法本质等价,差别仅在是否“生成器无关”、可移植性、脚本化友好,以及是不是只在类 Unix 上用 make
具体来说有以下的区别:
- 并行开关:现代
cmake --build … --parallel
跨平台统一;传统-j$(nproc)
只在类 Unix 顺手 - 配置选择:单配置(Make/Ninja)用
-DCMAKE_BUILD_TYPE=…
;多配置(VS/Xcode)用--config …
- 可移植性:现代命令一套走天下;传统命令依赖具体构建器与 shell
- 工作流:现代天然 out-of-source,多构建目录好管理;传统常手动
cd build
,容易写出“把中间文件丢源码树”的脚本 - 生态与可维护性:现代写法更容易接入 presets、打包、安装、工具链文件(
-DCMAKE_TOOLCHAIN_FILE=…
)等现代 CMake 习惯
最后,无论如何都更加推荐使用现代写法
,除非是古早项目或者项目指定使用旧版本的cmake
现代写法
cmake -S <src> -B <build> [-DCMAKE_BUILD_TYPE=Release] [-DCMAKE_INSTALL_PREFIX=$PWD/install]
cmake --build <build> --parallel
cmake --install <build> # 需要时
其中<src>是源码目录,<build>是构建和编译目录,通常是名为build的文件夹
特性
- 生成器无关:
cmake --build
会自动调用对应的构建器(ninja
/make
/msbuild
/xcodebuild
),同一套命令跑遍 Linux/Windows/macOS - 多配置友好(VS/Xcode 这类多配置生成器):配合
--config Release/Debug
使用,而不是CMAKE_BUILD_TYPE
- 目录干净:天然 out-of-source(
-S/-B
),多个构建目录(Debug/Release/ASan…)并存不打架 - 脚本/CI 友好:选项清晰、可预测;再配合
CMakePresets.json
更香 - 一致并行参数:
--parallel
统一了-jN
的差异(Windows 上没有nproc
这类工具) - 更易移植:切换 Ninja、VS、Xcode、Make 都不用改命令
适用场景
- 跨平台维护(同一仓在 Linux + Windows + macOS 上编译)
- 需要多配置并存(Debug/Release/ASan/TSan)或不同工具链(gcc/clang/clang-cl)
- CI/CD、容器、脚本化构建,或要用 CMakePresets.json 做一键配置
- 使用 Ninja、MSBuild、Xcode 等非 make 生成器
- 需要
cmake --install
做安装打包、CPack 出包
传统写法(类 Unix 风格)
mkdir build && cd build
cmake -DCMAKE_BUILD_TYPE=Release ..
make -j$(nproc)
特性
- 绑定单一生成器:默认是 “Unix Makefiles”。换 Ninja/VS/Xcode 时命令要跟着改(如
ninja
、msbuild
) - 单配置思维:
CMAKE_BUILD_TYPE
只对单配置生成器(Makefiles/Ninja)直观。VS/Xcode 下常被忽略,需要改用--config
- shell 依赖:
$(nproc)
、管道、小工具在 Windows 上不可用或语法不同 - 上手快:在纯 Linux + make 的环境里,肌肉记忆强,输入最短
适用场景
- 只在 Linux/Unix 上、只用
make
,团队已有大量历史脚本/文档 - 个人本机快速编译、对跨平台不敏感
- CMake 版本老(非常老的发行版上没有
-S/-B
/--install
/--parallel
)
其他环境的写法
-
Linux + Ninja(推荐构建器,速度快)
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release cmake --build build --parallel
-
Linux + Make(传统)
mkdir -p build && cd build cmake -DCMAKE_BUILD_TYPE=Release .. make -j"$(nproc)"
-
Windows + Visual Studio(多配置)
cmake -S . -B build -G "Visual Studio 17 2022" cmake --build build --config Release --parallel
-
macOS + Xcode(多配置)
cmake -S . -B build -G Xcode cmake --build build --config Release --parallel