10.cmake使用不同编译器
使用不同编译器
强制使用命令行选择编译器
1 |
|
⚠️ 命令行操作的 3 个“深坑”提醒
- 路径中的空格:如果编译器路径包含空格(如
C:\Program Files\...),必须用双引号包裹路径,例如-DCMAKE_CXX_COMPILER="C:/Program Files/LLVM/bin/clang++.exe"。 - 混合使用生成器:千万不要在一个已经生成的
build文件夹里切换编译器。- 后果:CMake 会报错“编译器不匹配”。
- 对策:切换编译器前,必须手动删除整个
build文件夹,或者为每个编译器指定不同的目录(如build_gcc,build_msvc)。
- MSVC 的环境限制:在纯命令行中使用
cl.exe(MSVC) 或icx(Intel) 时,普通的 CMD 往往找不到编译器。- 对策:在 Windows 搜索栏输入 **”Developer Command Prompt for VS 2022”**,在那个特制的命令行窗口里执行命令。
使用CMakePresets.json
1.gcc版本CMakePresets.json
1 | { |
2. 如何在命令行中使用
有了这个文件,再也不需要敲长命令了,只需要执行:
配置阶段 (Configure)
1 | # 配置为 Debug 版本 |
构建阶段 (Build)
1 | # 直接构建 |
3. 关键点说明
Generator (生成器): 这里使用了
"Ninja"。在 Windows 上配合 GCC 时,Ninja 的速度远超MinGW Makefiles。请确保安装了 Ninja(VS2022 默认带了,路径通常在Path里)。Inheritance (继承): 使用了
"inherits"关键字。这样只需要在一个地方 (base-gcc) 定义编译器路径,Debug 和 Release 模式会自动继承它,减少重复代码。Path (路径): 这里的
"gcc.exe"是简写。如果 GCC 没有添加到系统环境变量Path中,需要把这里改写成绝对路径(注意用正斜杠),例如:"C:/msys64/mingw64/bin/g++.exe"。命令行与
CMakePresets.json的交互逻辑: 当执行cmake --preset时,CMake 会在当前目录下自动寻找CMakePresets.json。它会读取文件里的generator、cacheVariables(编译器路径)和environment,然后自动应用到命令中。
4. 常见问题排查
如果在执行 cmake --preset gcc-debug 时报错:
- 找不到编译器:检查
gcc --version是否能在终端运行。如果不能,请手动补全 JSON 里的绝对路径。 - 找不到 Ninja:如果报错找不到 Generator,可以将
"generator": "Ninja"改为"generator": "MinGW Makefiles",但此时需要确保mingw32-make在你的路径中。
5. 命令行微调
如果偶尔需要用一个极其特殊的编译器版本,可以在命令行覆盖 Preset:
1 | cmake --preset=gcc-debug -DCMAKE_CXX_COMPILER=C:/special/g++.exe |
6. 验证是否生效
如果想看 CMake 到底识别了哪些预设,可以在项目目录下输入:
1 | cmake --list-presets |
其他编译器的CMakePresets.json写法
clang编译器
1 | { |
构建命令
1 | cmake --preset=clang-win-x64 |
intel编译器
需要先运行脚本
1
"C:\Program Files (x86)\Intel\oneAPI\setvars.bat" intel64
配置
1 | { |
构建命令
1 | cmake --preset=intel-icx-x64 |
msvc编译器
1 | { |
使用方法:
在 Windows 开始菜单中找到 “Developer Command Prompt for VS 2022” (或 “x64 Native Tools Command Prompt”)。
在这个特殊的黑窗口里切换到你的项目目录。
执行命令:
1
2cmake --preset msvc-x64-debug
cmake --build --preset msvc-build
vs2022生成的CMakePresets.json
1 | { |
vs2022中下载intel编译器插件后兼容intel编译器写法
1 | { |
使用继承的写法
1 | { |
vs2022中使用qt6的生成内容
1 | { |
编译命令
1 | cmake --preset <预设名称> |
clion中配置CMakePresets.json
clion中使用CMakePresets.json的前提
需要在ToolChains中添加system环境C:\Program Files (x86)\Intel\oneAPI\setvars.bat
设置编译器为icx.exe.
添加配置
1
2
3
4"vendor": {
"jetbrains.com/clion": {
"toolchain": "Intel oneAPI"
}
完整配置:
1 | { |
