19、与 IDE 集成:Visual Studio、CLion、VS Code 对 CMake Presets 的支持

说实话,CMake Presets 这东西,光在命令行里敲确实有点浪费。我平时大部分时间还是在 IDE 里写代码,毕竟谁不喜欢智能提示和图形化调试呢?

这几年主流 IDE 对 Presets 的支持越来越好了。你想想看,团队里有人用 VS,有人用 CLion,还有人用 VS Code,如果每个 IDE 都要单独配一遍构建参数,那 Presets 的「标准化」意义就大打折扣了。

今天我就聊聊这三款 IDE 对 CMake Presets 的支持情况。都是我自己踩过的坑,希望能帮你少走弯路。

Visual Studio:原生支持,但有个小坑

Visual Studio 2019 开始就支持 CMake Presets 了。到了 VS 2022,支持已经相当完善。我个人习惯是把 CMakePresets.json 放在项目根目录,VS 打开项目后会自动识别。

VS 会把 Presets 里的配置项直接映射到 IDE 的配置下拉菜单里。比如你定义了 debugrelease 两个 Preset,在 VS 的解决方案配置里就能直接选。

关键点:VS 优先读取 CMakePresets.json,如果没有,才会回退到传统的 CMakeSettings.json。所以如果你两个文件都有,VS 会忽略后者。

我曾经遇到过一个坑:VS 对 vendor 字段的支持不太好。如果你在 Presets 里写了 "vendor": { "microsoft.com/VisualStudioSettings/...": ... },VS 会尝试解析这些扩展字段。但如果你写错了格式,VS 会直接报错,连 Presets 都不加载。

避坑指南:VS 的 vendor 字段格式比较严格。我曾经因为少写了一个斜杠,导致整个 Presets 文件失效。建议先在 VS 里新建一个 Preset,看看它自动生成的 vendor 格式是什么样的,然后照着写。

VS 还支持在 CMakePresets.json 里配置调试器。比如你可以指定 "debugger": { "type": "cppvsdbg" },这样按 F5 调试时,VS 会自动用你指定的调试器。

{
  "version": 3,
  "configurePresets": [
    {
      "name": "vs-debug",
      "displayName": "VS Debug (x64)",
      "generator": "Visual Studio 17 2022",
      "architecture": { "value": "x64" },
      "cacheVariables": {
        "CMAKE_BUILD_TYPE": "Debug"
      },
      "vendor": {
        "microsoft.com/VisualStudioSettings/CMake/1.0": {
          "remoteCopySources": true
        }
      }
    }
  ]
}

CLion:最懂 CMake 的 IDE

CLion 对 CMake Presets 的支持,我个人认为是三款 IDE 里最好的。毕竟 JetBrains 的 CMake 插件一直在更新,而且 CLion 本身就是以 CMake 为核心构建系统的。

CLion 2022.1 开始完整支持 Presets。你打开项目后,CLion 会自动读取 CMakePresets.json,然后在顶部的配置选择器里列出所有 Preset。

有个细节我很喜欢:CLion 会显示 Preset 的 displayNamedescription。如果你在 Presets 里写了 "description": "用于单元测试的 Debug 构建",鼠标悬停时就能看到这段说明。这对团队协作特别有用。

小技巧:CLion 支持在 Presets 里配置 toolchain。比如你可以指定 "toolchain": { "file": "toolchain.cmake" },CLion 会自动加载这个工具链文件。我在做嵌入式开发时经常用这个功能。

CLion 还有一个隐藏功能:它支持 Presets 的 inherit 链。如果你定义了多个 Preset,CLion 会在 UI 上显示继承关系。比如 base Preset 被 debugrelease 继承,CLion 会用一个树形结构展示出来。

不过要注意,CLion 对 buildPresets 的支持比 configurePresets 晚一些。我记得 CLion 2022.3 才完整支持 build Presets。如果你用的版本比较老,可能只能看到 configure Preset。

VS Code:插件加持,灵活但需要配置

VS Code 本身不直接支持 CMake Presets,但通过 CMake Tools 插件,支持得相当不错。这个插件是微软官方维护的,更新很勤快。

安装 CMake Tools 插件后,它会自动读取项目根目录的 CMakePresets.json。你可以在 VS Code 底部的状态栏看到当前激活的 Preset,点击就能切换。

我个人习惯在 .vscode/settings.json 里指定默认 Preset:

{
  "cmake.configureOnOpen": true,
  "cmake.preset": "debug",
  "cmake.buildPreset": "debug-build"
}

这样每次打开项目,VS Code 会自动用 debug Preset 配置,用 debug-build Preset 构建。省得每次都要手动选。

注意:VS Code 的 CMake Tools 插件对 version 字段有要求。它只支持 version 3 及以上的 Presets 文件。如果你还在用 version 2,插件会提示你升级。

VS Code 还有一个优势:它支持 多根目录 项目。如果你的项目是多个 CMake 子项目组成的,每个子项目都有自己的 CMakePresets.json,VS Code 能分别识别。这点 VS 和 CLion 做得就没这么好。

不过 VS Code 也有个缺点:它对 vendor 字段的支持比较弱。如果你在 Presets 里写了 VS 或 CLion 的 vendor 扩展,VS Code 会直接忽略。所以如果你团队里有人用 VS Code,建议不要依赖 vendor 字段。

三款 IDE 的对比

我整理了一个表格,方便你对比:

功能 Visual Studio CLion VS Code
Presets 自动识别 ✅ 原生支持 ✅ 原生支持 ✅ 需 CMake Tools 插件
configurePresets ✅ 完整支持 ✅ 完整支持 ✅ 完整支持
buildPresets ✅ 支持 ✅ 2022.3+ ✅ 支持
testPresets ⚠️ 部分支持 ✅ 支持 ⚠️ 部分支持
vendor 扩展 ✅ 支持,但格式严格 ✅ 支持 ❌ 忽略
多根目录项目 ⚠️ 有限支持 ⚠️ 有限支持 ✅ 支持较好
调试器配置 ✅ 支持 ✅ 支持 ⚠️ 需额外配置

我的建议

如果你团队里 IDE 不统一,我建议这样做:

  1. 只写标准的 Presets 字段。别依赖 vendor 扩展,因为 VS Code 会忽略它们。
  2. displayNamedescription。这样不管用哪个 IDE,都能看到清晰的构建说明。
  3. 测试 Presets 时,三个 IDE 都试一遍。我曾经遇到过 CLion 能读但 VS 报错的情况,原因是 VS 对 JSON 格式更严格。

个人经验:我团队里有人用 VS,有人用 CLion。我们最后统一用 CMakePresets.json(version 3),不写任何 vendor 字段。结果三个 IDE 都能正常工作。说白了,Presets 的初衷就是标准化,vendor 字段反而是「非标」的东西。

核心逻辑图

下面这张图展示了 CMake Presets 与三款 IDE 的集成关系:

CMake Presets 与 IDE 集成关系图 CMakePresets.json Visual Studio CLion VS Code 特性 • 原生支持,自动识别 • 支持 vendor 扩展 • 调试器配置 • 格式要求严格 特性 • 原生支持,显示描述 • 支持 inherit 链 • 支持 toolchain • 对 buildPresets 支持较晚 特性 • 需 CMake Tools 插件 • 支持多根目录 • 忽略 vendor 字段 • 可配置默认 Preset 三款 IDE 均支持 CMake Presets,但特性和支持程度各有不同

说白了,CMake Presets 的价值就在于「一次配置,到处使用」。不管团队用什么 IDE,只要 Presets 文件写对了,大家都能获得一致的构建体验。我个人觉得,这才是 Presets 最核心的价值所在。


公众号:蓝海资料掘金营,微信deep3321