在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_FILE、CMAKE_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.txt 和 CMakeSettings.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"
}
}
]
}