Visual Studio 工程配置相关

在Visual Studio中新建CMake工程,需要选中: 选中"将解决方案和项目放在同一目录中"复选框

1. CMakePresets.json

创建 Visual Studio 项目

  • 使用"CMake 项目"模板在 Visual Studio 中创建新项, 默认会生成CMakePresets.json

CMAKE的标准文件,是用来固化 CMake 配置参数 的标准配置文件,让你和团队成员不用再记住和输入一长串命令行参数, 简化CMAKE配置,也是直接给vs用的.

示例:CMakePresets.json

复制代码
{
  "version": 3,
  "configurePresets": [
    {
      "name": "debug",
      "binaryDir": "${sourceDir}/build/debug",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "D:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake",
        "CMAKE_BUILD_TYPE": "Debug"
      }
    },
    {
      "name": "release",
      "binaryDir": "${sourceDir}/build/release",
      "cacheVariables": {
        "CMAKE_TOOLCHAIN_FILE": "D:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake",
        "CMAKE_BUILD_TYPE": "Release"
      }
    }
  ]
}

|------------------|-----------------|---------------------------------------------|
| name | preset 名称,命令行使用 | "debug" |
| binaryDir | 构建输出目录 | "${sourceDir}/build" |
| generator | 指定构建系统 | "Ninja""Visual Studio 17 2022" |
| cacheVariables | CMake 变量 | CMAKE_TOOLCHAIN_FILECMAKE_CXX_STANDARD |
| inherits | 继承其他 preset | "base" |
| environment | 设置环境变量 | {"VCPKG_ROOT": "D:/dev/vcpkg"} |

bash 复制代码
# 没有 preset 时(又长又容易出错)
cmake -B build -S . -DCMAKE_TOOLCHAIN_FILE=D:/dev/vcpkg/scripts/buildsystems/vcpkg.cmake -DCMAKE_BUILD_TYPE=Debug -G "Visual Studio 17 2022"

# 有 preset 后(简洁明了)
cmake --preset default

cmake --preset debug      # Debug 构建
cmake --preset release    # Release 构建  
# 注意: 使用 --preset 需要找到CMakePreset.json
  • CMakePresets.json = 团队共享配置(提交 Git)

  • CMakeUserPresets.json = 个人本地配置(不提交 Git),会继承CMakePresets.json, 会优先使用,有些配置会覆盖掉CMakePresets.json

2. Ninja 和 MSVC的关系

Ninja 和 MSVC 是两种完全不同性质的工具,它们不是二选一的关系,而是可以配合使用的。

特性 MSVC Ninja (MSBuild)
性质 编译器 (Compiler) 构建工具 (Build Tool) ,也可以配合GCC使用
作用 把源代码编译成机器码 决定先编译哪个文件、并行编译几个文件
类比 厨师 厨房调度员
输出 .obj, .exe, .dll 调用编译器完成编译

3. Viusal Studio 在CMakeLists.txt上右键菜单说明:

3.1 点击配置"hellworld"

用于**: 使用Ninja 生成器为项目生成构建系统**

等价于: cmake-gui 的 Configure + Generate

1> 命令行: "C:\Windows\system32\cmd.exe" /c "%SYSTEMROOT%\System32\chcp.com 65001 >NUL && "D:\INTALLEDAPPS\VISUALSTUDIO\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\CMake\bin\cmake.exe" -G "Ninja" -DCMAKE_BUILD_TYPE:STRING="Debug" -DCMAKE_INSTALL_PREFIX:PATH="D:\dev\002-test\out\install\x64-Debug" -DCMAKE_C_COMPILER:FILEPATH="D:/IntalledApps/VisualStudio/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe" -DCMAKE_CXX_COMPILER:FILEPATH="D:/IntalledApps/VisualStudio/VC/Tools/MSVC/14.44.35207/bin/Hostx64/x64/cl.exe" -DCMAKE_MAKE_PROGRAM="D:\INTALLEDAPPS\VISUALSTUDIO\COMMON7\IDE\COMMONEXTENSIONS\MICROSOFT\CMAKE\Ninja\ninja.exe" "D:\dev\002-test" 2>&1"

1> 工作目录: D:\dev\002-test\out\build\x64-Debug

1> [CMake] -- Configuring done (0.1s)

1> [CMake] -- Generating done (0.0s)

1> [CMake] -- Build files have been written to: D:/dev/002-test/out/build/x64-Debug

1> 已提取 CMake 变量。

在CMake-GUI 中:

第一次 Configure → 创建/读取 CMakeCache.txt - 红色变量 → 不在缓存中(新检测到的) - 白色变量 → 已在缓存中 -

Generate → 根据缓存生成构建文件

总结CMakeCache.txt 就像是 CMake 的"注册表",记住所有配置信息,避免重复劳动。需要完全重新配置时,删除它就对了。

4. tasks.vs.json

文件是 Visual Studio 为了支持 "打开文件夹" 开发模式而引入的一个配置文件。

简单来说,它的核心作用是让你能为项目添加自定义的"任务",并通过右键菜单直接运行,从而实现对非标准构建流程的自动化

1. 核心作用:为非 CMake 项目定制构建流程

对于不使用 CMake 或 Visual Studio 原生解决方案(.sln)的项目,Visual Studio 可能无法自动识别其构建方式。tasks.vs.json 就是用来解决这个问题的。

你可以在文件中定义如何构建 (build)清理 (clean)重建 (rebuild) 项目,告诉 Visual Studio 该调用什么命令。例如,为一个使用 makefile 的项目定义构建任务。

2. 与 CMake 项目的关系

需要特别注意 :如果你正在处理的是一个 CMake 项目,那么这个文件通常用不上

根据微软官方的架构参考文档,明确提到:"CMake 项目不使用此文件,因为所有生成命令都在 CMakeLists.txt 中指定 "。对于 CMake 项目,Visual Studio 会直接读取 CMakeLists.txtCMakeSettings.json 来获取构建信息。

3. 通用能力:执行任意任务

除了构建项目,tasks.vs.json 的另一个重要作用是将一些常用的脚本或命令集成到 IDE 中。你可以在里面定义任何想要执行的操作,然后通过在解决方案资源管理器中右键点击文件或文件夹来运行它。

一个简单的例子:定义一个"回显文件名"的任务,当你右键点击任意 .js 文件时,它就会在输出窗口显示该文件的名称。

4. 关键配置参数

一个标准的任务定义通常包含以下几个关键参数:

  • taskLabel(必需) 任务在右键菜单中显示的名称。

  • appliesTo(必需) 指定哪些文件类型或文件夹右键时显示此任务,支持通配符,如 "*.cpp"

  • contextType:定义任务在菜单中的分组,可以是 "build""clean""custom"(自定义)等。

  • type:任务的执行类型。对于大多数本地命令,使用 "launch" 即可。

  • command(核心) 指定要执行的命令或脚本的完整路径。

  • args:为 command 指定的命令行参数。

特性 说明
适用场景 主要用于非 CMake、非 .sln 的"打开文件夹"项目。
主要用途 1. 为不被 Visual Studio 识别的项目自定义构建步骤。 2. 集成并快速运行任何常用的外部命令或脚本。
与 CMake 的关系 CMake 项目通常不需要也不使用此文件
如何创建 在"解决方案资源管理器"中右键任意文件或文件夹,选择 "配置任务",即可自动创建或打开该文件。

"Project"的CMake设置

会自动创建CMakeSettings.json文件,可以在VS的配置管理器中使用

5. VCPKG

VCPKG 有两种工作模式:

Manifest 模式,而 Manifest 模式的设计目标不是"使用本地已安装的库",而是"根据配置文件精确下载和安装指定版本的库"。

两种模式的区别

特性 经典模式 (Classic Mode) Manifest 模式 (Manifest Mode)
你的操作 vcpkg install fmt vcpkg.json 中声明依赖
包存储位置 全局:%VCPKG_ROOT%/installed 项目隔离:项目目录/vcpkg_installed
版本控制 只能安装最新版 支持精确版本锁定
是否需要联网 仅安装时需要 每次配置都可能需要(用于版本解析)
适用场景 个人开发、临时测试 团队协作、CI/CD、需要版本一致性

从技术原理上看,vcpkg 的 Manifest 模式为了确保"版本绝对精确 "和"构建可复现".

既然你已经通过 vcpkg install fmt 在经典模式下安装了 fmt,你可以直接使用它,无需 Manifest 模式。

做法 :在 CMake 配置时禁用 Manifest 模式

CMakePresets.json 中添加:

json

复制代码
{
  "cacheVariables": {
    "VCPKG_MANIFEST_MODE": "OFF"
  }
}

这样做的好处是:

  • vcpkg 不会尝试下载/安装任何包

  • CMake 会直接在你全局的 %VCPKG_ROOT%/installed 目录中查找 fmt

  • 完全不需要联网

附录:

CMakePresets.json

bash 复制代码
{
    "version": 3,
    "configurePresets": [
      {
        "name": "windows-base",
        "hidden": true,
        "generator": "Ninja",
        "binaryDir": "${sourceDir}/out/build/${presetName}",
        "installDir": "${sourceDir}/out/install/${presetName}",
        "cacheVariables": {
          "CMAKE_C_COMPILER": "cl.exe",
          "CMAKE_CXX_COMPILER": "cl.exe"
        },
        // Only apply this preset on Windows hosts
        // lhs == rhs 只有当当前主机系统名称等于 "Windows" 时,这个预设才会生效。
        "condition": {
          "type": "equals",
          "lhs": "${hostSystemName}",
          "rhs": "Windows"
        }
      },
      {
        "name": "x64-debug",
        "hidden": true,
        "displayName": "x64 Debug",
        "inherits": "windows-base",
        "architecture": {
          "value": "x64",
          "strategy": "external" //external(工具链会处理)
        },
        "cacheVariables": {
          "CMAKE_BUILD_TYPE": "Debug"
        }
      },
      {
        "name": "x64-release",
        "hidden": true,
        "displayName": "x64 Release",
        "inherits": "x64-debug",
        "cacheVariables": {
          "CMAKE_BUILD_TYPE": "Release"
        }
      },
      {
        "name": "vcpkg",
        "displayName": "vcpkg",
        "hidden": true,
        "cacheVariables": {
          "CMAKE_TOOLCHAIN_FILE": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
          "VCPKG_MANIFEST_MODE": "OFF",
          "CMAKE_RUNTIME_OUTPUT_DIRECTORY": "${sourceDir}/out/bin"
        }
      }
    ]
}

CMakeUserPresets.json

bash 复制代码
{
  "version": 3,
  "configurePresets": [
    {
      "name": "vcpkg-x64-release",
      "displayName": "vcpkg-x64-release",
      "inherits": [ "vcpkg", "x64-release" ],
      "environment": {
        "VCPKG_ROOT": "D:/dev/vcpkg"
      }
    },
    {
      "name": "vcpkg-x64-debug",
      "displayName": "vcpkg-x64-debug",
      "inherits": [ "vcpkg", "x64-debug" ],
      "environment": {
        "VCPKG_ROOT": "D:/dev/vcpkg"
      }
    }
  ]
}
相关推荐
m0_716765232 小时前
数据结构--栈的插入、删除、查找详解
开发语言·数据结构·c++·经验分享·学习·青少年编程·visual studio
GDAL2 小时前
IntelliJ IDEA常用快捷键
ide·intellij-idea
GDAL2 小时前
IntelliJ IDEA 前端开发全面教程
java·ide·intellij-idea
特立独行的猫a2 小时前
HarmonyOS / OpenHarmony 平台三方库移植:使用vcpkg 移植 Crashpad 过程实战总结
harmonyos·移植·openharmony·vcpkg·crshpad
ZHANG13HAO17 小时前
Android 13 特权应用(Android Studio 开发)调用 AOSP 隐藏 API 完整教程
android·ide·android studio
NQBJT18 小时前
嵌入式从零开始(第十二篇):调试与工具链 —— 从 IDE 到逻辑分析仪
ide·stm32·单片机·嵌入式硬件·c#
小魏小魏我们去那里呀21 小时前
Java2Flowchart:一款把 Java 方法一键转换成 Mermaid 流程图的 IntelliJ 插件
java·ide·intellij-idea
WHS-_-202221 小时前
Pycharm 使用经验
ide·python·pycharm
m0_716765231 天前
数据结构--单链表的插入、删除、查找详解
c语言·开发语言·数据结构·c++·笔记·学习·visual studio