在 Visual Studio 中使用 CMake 预设进行配置和生成
CMake 支持下面两个文件,便于用户指定通用的配置、生成和测试选项,并与他人共享: 和 CMakePresets.json
CMakeUserPresets.json
。 使用这些文件,可以在 Visual Studio 和 Visual Studio Code 中、在持续集成 (CI) 管道中以及通过命令行驱动 CMake。
用于保存项目范围内的生成CMakePresets.json
。 可供开发人员用来保存自己的本地生成CMakeUserPresets.json
。 这两个文件在 Visual Studio 2019 版本 16.10 或更高版本中都受到支持。
本文介绍了 与 Visual Studio 的集成CMakePresets.json
。 以下是一些实用链接:
- 有关 格式的详细信息,请参阅官方 CMake 文档
CMakePresets.json
。 - 有关 Microsoft 供应商映射和宏扩展的详细信息,请参阅
CMakePresets.json
和CMakeUserPresets.json
Microsoft 供应商映射。 - 有关如何在 Visual Studio Code 中使用 的详细信息,请参阅使用 CMake 预设进行配置和生成
CMakePresets.json
。
建议将 用作 的替代文件CMakePresets.json
CMakeSettings.json
。 Visual Studio 将永远不会同时从 CMakePresets.json
和 CMakeSettings.json
中进行读取。 若要在 Visual Studio 中启用或禁用 集成,请参阅在 Visual Studio 2019 中启用 CMakePresets.json
CMakePresets.json
。
支持的 CMake 和 CMakePresets.json
版本
受支持的 CMakePresets.json
和 CMakeUserPresets.json
架构版本取决于你所使用的 Visual Studio 的版本:
- Visual Studio 2019 版本 16.10 及更高版本支持架构版本 2 和 3。
- Visual Studio 2022 版本 17.4 预览版 1 添加了对架构版本 4 的支持。
- Visual Studio 2022 版本 17.5 预览版 1 添加了对架构版本 5 的支持。
可以通过更改根对象中的 "version"
字段来更新版本。 有关示例和详细信息,请参阅 CMakePresets.json
格式。
通过命令行使用 CMakePresets.json
调用 CMake 时,需要使用 CMake 版本 3.20 或更高版本。 但是,Visual Studio 本身会读取和评估 和 ,并且不会直接使用 --preset
选项调用 CMakeCMakePresets.json
CMakeUserPresets.json
。 因此,当你在 Visual Studio 中使用 生成时,并不严格要求必须使用 CMake 版本 3.20 或更高版本CMakePresets.json
。
建议使用不低于 CMake 3.14 的版本。
在 Visual Studio 中启用 CMakePresets.json
集成
默认情况下,Visual Studio 中未启用 CMakePresets.json
集成。 可以在“工具”>“选项”>“CMake”>“常规”启用它:
可从 Visual Studio 2022 菜单访问此屏幕:“工具”>“选项”>“CMake”>“常规”。 该选项位于 CMake 配置文件部分下。
重要
关闭并重新打开 Visual Studio 中的文件夹,以激活集成。
在某些较旧版本的 Visual Studio 中,“工具”>“选项”>“CMake”>“常规”中只有一个选项可以启用 CMakePresets.json
集成:
下表指示何时使用 CMakePresets.json
而不是 CMakeSettings.json
驱动 CMake 配置并在 Visual Studio 2022 和 Visual Studio 2019 版本 16.10 及更高版本中生成。 如果没有配置文件,则使用默认“配置预设”。
在表中,“工具”>“选项”已启用意味着,已经在“工具”>“选项”>“CMake”>“常规”内选中“使用 CMakePresets.json 驱动 CMake 配置、生成和测试”。
配置文件 | “工具”>“选项”已禁用 | “工具”>“选项”已启用 |
---|---|---|
不存在配置文件 | CMakeSettings.json |
CMakePresets.json |
存在CMakeSettings.json |
CMakeSettings.json |
CMakePresets.json |
存在CMakePresets.json |
CMakePresets.json |
CMakePresets.json |
两个配置文件都存在 | CMakePresets.json |
CMakePresets.json |
修改自动配置和缓存通知
默认情况下,每次当前活动的“目标系统”或“配置预设”发生变化时,Visual Studio 都会自动调用 configure
。 可以通过在“工具”>“选项”>“CMake”>“常规”中选择“从不自动运行配置步骤”来修改此行为。 也可以通过取消选中“显示 CMake 缓存通知”来禁用所有 CMake 缓存通知(金色条形)。
默认配置预设
如果没有 CMakePresets.json
或 CMakeUserPresets.json
文件,或者 CMakePresets.json
或 CMakeUserPresets.json
无效,则 Visual Studio 会回退到以下默认配置预设:
Windows 示例
{
"name": "windows-default",
"displayName": "Windows x64 Debug",
"description": "Sets Ninja generator, compilers, x64 architecture, build and install directory, debug build type",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"architecture": {
"value": "x64",
"strategy": "external"
},
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": [ "Windows" ]
}
}
},
Linux 示例
{
"name": "linux-default",
"displayName": "Linux Debug",
"description": "Sets Ninja generator, compilers, build and install directory, debug build type",
"generator": "Ninja",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": [ "Linux" ]
},
"microsoft.com/VisualStudioRemoteSettings/CMake/1.0": {
"sourceDir": "$env{HOME}/.vs/$ms{projectDirName}"
}
}
}
如果你尝试打开或修改不存在的 文件,则 Visual Studio 会在项目的根目录下自动创建具有默认配置预设的 文件CMakePresets.json
CMakePresets.json
。
配置和生成
在 Visual Studio 工具栏上,启用 CMakePresets.json
集成时,“目标系统”、“配置预设”和“生成预设”有下拉列表:
选择“目标系统”
左侧的下拉列表表示当前活动的“目标系统”。 它是调用 CMake 来配置和生成项目的系统。 此下拉列表包括你的本地计算机、连接管理器中按主机名称列出的所有 SSH 连接,以及 Visual Studio 可以找到的所有适用于 Linux 的 Windows 子系统 (WSL) 安装:
下拉列表包含多个条目,包括“本地计算机”、“IP 地址 192.168.0.5”、“WSL: ubuntu2004”、“WSL: debian”和“管理连接”。
在上面的示例中:
- 192.168.0.5 是添加到连接管理器中的远程 Linux 系统。
- ubuntu2004 和 debian 是 WSL 安装。
选择“管理连接”,以打开连接管理器。
选择一个配置预设
中间的下拉列表表示当前活动的“配置预设”。 这是在调用 CMake 来生成项目生成系统时使用的 configurePreset
值。 此下拉列表包括在 和 中定义的非隐藏配置预设的并集CMakePresets.json
CMakeUserPresets.json
。
Visual Studio 将使用 Microsoft Visual Studio 设置供应商映射中的 hostOS
的值来隐藏不适用于活动目标系统的配置预设。 有关详细信息,请查看 Visual Studio 设置供应商映射下的表中的 hostOS
条目。
选择“管理配置”,打开项目根中的 文件CMakePresets.json
。 如果 尚不存在,则创建该文件CMakePresets.json
。
选择一个生成预设
右侧的下拉列表表示当前活动的“生成预设”。 这是在调用 CMake 来生成项目时使用的 buildPreset
值。 此下拉列表包括在 和 中定义的非隐藏“生成预设”的并集CMakePresets.json
CMakeUserPresets.json
。
所有“生成预设”都需要指定关联的 configurePreset
值。 Visual Studio 将隐藏不适用于活动配置预设的生成预设。 有关详细信息,请参阅“生成预设”列表。
如果没有与当前活动的配置预设关联的生成预设,则 Visual Studio 会列出默认生成预设。 默认“生成预设”相当于通过命令行传递不带其他任何参数的 cmake --build
。
配置
Visual Studio 在检测到 CMake 缓存过期时,会自动尝试配置项目。 若要手动调用配置,请从主菜单中选择“项目”>“配置 <project-name>”。 这与从命令行运行 cmake --preset <configurePreset>
相同,其中 <configurePreset>
是活动配置预设的名称。
若要禁用自动缓存生成,请参阅自动配置和缓存通知。
构建
若要生成整个项目,请从主菜单中选择“生成”>“全部生成”。 这与从命令行运行 cmake --build --preset <buildPreset>
相同,其中 <buildPreset>
是活动生成预设的名称。
若要生成单个目标,请切换到“解决方案资源管理器”中的“CMake 目标视图”。 然后,右键单击任意目标,并在快捷菜单中选择“生成”。
注意
Visual Studio 2019 不支持使用 buildPresets.targets
选项来生成 中指定的目标的子集CMakePresets.json
。
运行 CTest
支持 Visual Studio 2019 中的两个菜单选项CMakePresets.json
:
- <project-name> 的“测试”>“运行 CTests”将调用 CTest,并运行与活动配置预设和生成预设关联的所有测试,而不会将其他自变量传递给 CTest。
- <configurePreset> 的“测试”>“运行测试预设”将展开,以显示与活动配置预设关联的所有测试预设。 选择单个测试预设与从命令行运行
ctest --preset <testPreset>
相同,其中<testPreset>
是所选测试预设的名称。 如果没有为当前活动的“配置预设”定义“测试预设”,则此选项不可用。
在 Visual Studio 2019 中,测试资源管理器未与 集成CMakePresets.json
。
添加新预设
在 Visual Studio 2019 中,所有命令和预设模板都修改 CMakePresets.json
。 可直接编辑 来添加新的用户级预设CMakeUserPresets.json
。
对于 和 中的路径,请使用正斜杠 (/
)CMakePresets.json
CMakeUserPresets.json
。
添加新的配置预设
若要将新的配置预设添加到 ,请在“解决方案资源管理器”的“文件夹视图”中右键单击 ,然后在快捷菜单中选择“添加配置”CMakePresets.json
CMakePresets.json
。 此时会显示用于选择配置预设模板的对话框:
选择要在 Windows 系统上配置的“Windows x64 调试”模板。 选择要在 WSL 和远程 Linux 系统上配置的“Linux 调试”模板。 有关编辑 的详细信息,请参阅编辑预设CMakePresets.json
。
所选模板会添加到 (若有)中CMakePresets.json
。 否则,模板会复制到新的 文件中CMakePresets.json
。
添加新的生成预设和测试预设
Visual Studio 2019 不会为新的生成预设和测试预设提供模板。 可直接编辑 来添加生成预设和测试预设CMakePresets.json
。 有关详细信息,请参阅“生成预设”列表、“测试预设”列表或示例 CMakePresets.json
文件。
编辑预设
官方 CMake 文档是有关编辑配置预设、生成预设和测试预设的最佳资源。 以下信息是与 Visual Studio 开发人员特别相关的 CMake 文档子集。
选择编译器
可以在“配置预设”中使用 cacheVariables.CMAKE_C_COMPILER
和 cacheVariables.CMAKE_CXX_COMPILER
设置 C 和 C++ 编译器。 这相当于通过命令行将 -D CMAKE_C_COMPILER=<value>
和 -D CMAKE_CXX_COMPILER=<value>
传递到 CMake。 有关详细信息,请参阅 CMAKE_<LANG>_COMPILER
。
使用以下示例,在 Visual Studio 中使用 cl.exe
和 clang-cl.exe
进行生成。 必须安装适用于 Windows 组件的 C++ Clang 工具,才能使用 clang-cl
进行生成。
使用 生成cl.exe
:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "cl",
"CMAKE_CXX_COMPILER": "cl"
},
使用 生成clang
:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "clang-cl",
"CMAKE_CXX_COMPILER": "clang-cl"
},
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"intelliSenseMode": "windows-clang-x64"
}
}
如果使用 Visual Studio 16 2019
或 Visual Studio 17 2022
作为生成器,则可以使用 toolset
配置预设来指定 ClangCL
工具集:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
},
"toolset": "ClangCL",
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"intelliSenseMode": "windows-clang-x64"
}
}
有关支持 toolset
规范的生成器的详细信息,请参阅 CMake 文档中的 CMAKE_GENERATOR_TOOLSET
。
重要
在 Visual Studio 2019 中,当你使用 clang
或 clang-cl
进行生成时,必须显式指定 Clang IntelliSense 模式。
若要在 Visual Studio 之外重现这些生成,请参阅通过命令行或 CI 管道运行 CMake。
若要在 Linux 上或不使用 Visual C++ 工具集进行生成,请指定 PATH
实例上的编译器名称,或计算结果为编译器完整路径的环境变量。 不建议使用完整路径,以便文件可以共享。 使用 GCC 版本 8 生成的预设可能如下所示:
"cacheVariables": {
"CMAKE_BUILD_TYPE": "Debug",
"CMAKE_INSTALL_PREFIX": "${sourceDir}/out/install/${presetName}",
"CMAKE_C_COMPILER": "gcc-8",
"CMAKE_CXX_COMPILER": "g++-8"
},
还可以使用 CMake 工具链文件设置编译器。 可使用 cacheVariables.CMAKE_TOOLCHAIN_FILE
设置工具链文件,这等效于从命令行将 -D CMAKE_TOOLCHAIN_FILE=<value>
传递到 CMake。 CMake 工具链文件最常用于交叉编译。 若要详细了解如何创作 CMake 工具链文件,请查看 CMake 工具链。
选择生成器
Windows 和 Linux 配置预设模板均将 Ninja 指定为默认生成器。 其他常见的生成器包括 Windows 上的 Visual Studio 生成器和 Linux 和 macOS 上的 Unix Makefile。 可以在配置预设中使用 generator
选项指定新的生成器。 这等效于从命令行将 -G
传递到 CMake。
在使用 Visual Studio 生成器进行生成时,将 architecture.strategy
和 toolset.strategy
设置为 set
。 有关详细信息,请查看 CMake 生成器。
选择配置类型
可以使用 cacheVariables.CMAKE_BUILD_TYPE
为单个配置生成器设置配置类型(Debug
或 Release
)。 这等效于从命令行将 -D CMAKE_BUILD_TYPE=<value>
传递到 CMake。 有关详细信息,请参阅 CMAKE_BUILD_TYPE
。
在使用 Visual C++ 工具集进行生成时,选择目标体系结构和主机体系结构
可以使用 architecture.value
来设置目标体系结构(x64、Win32、ARM64 或 ARM)。 这等效于从命令行将 -A
传递到 CMake。 有关详细信息,请查看平台选择。
注意
目前,Visual Studio 生成器要求使用 Win32 语法,而命令行生成器(如 Ninja)则要求使用在为 x86 生成时的 x86 语法。
可以使用 toolset.value
来设置主机体系结构(x64 或 x86)和工具集。 这等效于从命令行将 -T
传递到 CMake。 有关详细信息,请查看工具集选择。
architecture.strategy
和 toolset.strategy
值指示 CMake 如何处理体系结构和工具集字段。 set
表示 CMake 将设置相应的值,而 external
表示 CMake 将不会设置相应的值。
建议将 set
与 IDE 生成器(如 Visual Studio 生成器)配合使用。 将 external
与命令行生成器(如 Ninja)配合使用。 通过这些值,Visual Studio 等供应商可在调用 CMake 之前提供所需的环境。 若要详细了解体系结构和工具集字段,请参阅“配置预设”列表。
如果不想提供环境,则可以将 architecture.strategy
设置为 external
,将 architecture.value
设置为 unspecified
。 你可能会发现,对于以下任何一种原因,不提供环境都很有用:
- 你在使用 MSVC 以外的工具集。
- 你在使用自定义工具链,例如嵌入场景中。
- 你无需特定环境即可构建。
有关支持体系结构字段的 IDE 生成器的完整列表,请参阅 CMAKE_GENERATOR_PLATFORM
。 有关支持工具集字段的 IDE 生成器的完整列表,请参阅 CMAKE_GENERATOR_TOOLSET
。
使用下面的示例,在使用 Ninja 生成器时以 ARM64 为目标,或在使用 Visual Studio 16 2019 生成器时以 Win32 (x86) 为目标:
"generator": "Ninja",
"architecture": {
"strategy": "external",
"value": "arm64"
},
"generator": "Visual Studio 16 2019",
"architecture": {
"strategy": "set",
"value": "Win32"
},
设置和引用环境变量
可以使用环境映射来设置环境变量。 环境变量通过 inherits
字段继承,但你可根据需要进行替代。
预设的环境是其自身环境与其所有父级环境的联合。 如果多个 inherits
预设为同一变量提供了冲突的值,则首选 inherits
列表中较早的预设。 可以通过将变量设置为 null
,来取消设置该继承自另一个预设的变量。
除非 inheritConfigureEnvironment
设置为 false
,否则在“配置预设”中设置的环境变量也会自动流向关联的“生成预设”和“测试预设”。 有关详细信息,请参阅“配置预设”列表。
可以使用 $env{<variable-name>}
和 $penv{<variable-name>}
语法来引用环境变量。 有关详细信息,请查看宏扩展。
为交叉编译器配置 IntelliSense
默认情况下,Visual Studio 使用与指定的工具集和目标体系结构相匹配的 IntelliSense 模式。 若要进行交叉编译,则可能需要使用 Visual Studio 设置供应商映射中的 intelliSenseMode
选项来手动指定正确的 IntelliSense 模式。 有关详细信息,请查看 Visual Studio 设置供应商映射下的表中的 intelliSenseMode
条目。
在远程系统或适用于 Linux 的 Windows 子系统上进行配置和生成
借助 Visual Studio 中的 支持,你可以轻松地在 Windows、WSL 和远程系统上配置和生成项目CMakePresets.json
。 在 Windows、远程系统或 WSL 上配置和生成项目的步骤是相同的。 然而,有一些行为是特定于远程开发的。
远程复制方案中的 ${sourceDir}
行为
在本地方案(包括 WSL1)中,${sourceDir}
的计算结果为在 Visual Studio 中打开的项目源目录的路径。 在远程复制方案中,${sourceDir}
的计算结果为“目标系统”上项目源目录的路径,而不是本地计算机上项目源目录的路径。
Visual Studio 远程设置供应商映射中的 sourceDir
值决定了“目标系统”上的项目源目录(默认为 $env{HOME}/.vs/$ms{projectDirName}
)。 有关详细信息,请查看 Visual Studio 设置供应商映射下的表中的 sourceDir
条目。
远程输出的本地文件夹
如果 Visual Studio 远程设置供应商映射中的 copyBuildOutput
设置为 true
,则远程复制方案需要一个本地目录来复制一些远程文件,如 CMake 文件 API 响应文件或生成文件。 这些文件将自动复制到 <local-source-directory>/out/<remote-connection-ID>/build/${presetName}
。
在 Windows 和 WSL1 上调用相同的“配置预设”
如果尝试在 Windows 和 WSL1 上使用相同的配置预设,将会出现错误。 Windows 和 WSL1 都使用 Windows 文件系统,因此 CMake 会尝试对 Windows 和 WSL1 生成树使用相同的输出目录 (binaryDir
)。
若要将相同的“配置预设”同时用于 Windows 和 WSL1 工具集,请创建另一个继承自原始预设的“配置预设”,并指定新的 binaryDir
值。 在以下示例中,windows-preset
可以在 Windows 上使用,base-preset
可以在 WSL1 上使用:
{
"name": "windows-preset",
"inherits": "base-preset",
"binaryDir": "${sourceDir}/out/build/${presetName}",
"vendor": {
"microsoft.com/VisualStudioSettings/CMake/1.0": {
"hostOS": "Windows"
}
}
}
注意
在 Visual Studio 2019 中,仅支持 WSL1 工具集。 每当在 Windows 和 WSL 上调用 configure
时,都会看到这种行为。
启用 vcpkg 集成
Vcpkg 可帮助管理 Windows、Linux 和 macOS 上的 C 和 C++ 库。 必须将 vcpkg 工具链文件 (vcpkg.cmake
) 传递到 CMake 才能启用 vcpkg 集成。 有关详细信息,请查看 vcpkg 文档。
启用 集成后,Visual Studio 不再自动将 vcpkg 工具链文件传递到 CMakeCMakePresets.json
。 此更改消除了特定于 Visual Studio 的行为,并确保你可以通过命令行重现生成。
相反,可以使用 中的 VCPKG_ROOT
环境变量将路径设置为 vcpkg.cmake
CMakePresets.json
:
"cacheVariables": {
"CMAKE_TOOLCHAIN_FILE": {
"value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
"type": "FILEPATH"
}
},
VCPKG_ROOT
应设置为 vcpkg 安装的根目录。 有关详细信息,请查看 vcpkg 环境变量。
如果你已经在使用 CMake 工具链文件,并且想要启用 vcpkg 集成,请参阅使用多个工具链文件。 按照这些说明操作,以通过使用 vcpkg 将外部工具链文件与项目结合使用。
launch.vs.json
和 tasks.vs.json
中的变量替换
支持 和 中的变量替换CMakePresets.json
launch.vs.json
tasks.vs.json
。 下面是一些注意事项:
活动配置预设中设置的环境变量会自动流向 和 配置
launch.vs.json
tasks.vs.json
。 可将各个环境变量设置为null
来取消设置 和 中的各个环境变量launch.vs.json
tasks.vs.json
。 以下示例在 中将变量DEBUG_LOGGING_LEVEL
设置为null
:"env": { "DEBUG_LOGGING_LEVEL": null }
launch.vs.json
。活动配置预设中设置的键值可通过语法
${cmake.<KEY-NAME>}
在 和 中使用launch.vs.json
tasks.vs.json
。 例如,使用${cmake.binaryDir}
引用活动配置预设的输出目录。活动配置预设的环境映射中设置的各个环境变量可通过语法
${env.<VARIABLE-NAME>}
在 和 中使用launch.vs.json
tasks.vs.json
。
更新 和 文件以引用 语法而不是 语法launch.vs.json
task.vs.json
CMakePresets.json
CMakeSettings.json
。 当 作为活动配置文件时引用旧 语法的宏将在未来发布的版本中被弃用CMakeSettings.json
CMakePresets.json
。 例如,由于 使用 binaryDir
语法,可使用 ${cmake.binaryDir}
而不是 ${cmake.buildRoot}
来引用活动配置预设的输出目录CMakePresets.json
。
疑难解答
如果没有按预期运行,则可以尝试一些故障排除步骤。
如果 或 无效,则 Visual Studio 会回退到其默认行为,并只显示默认配置预设CMakePresets.json
CMakeUserPresets.json
。 Visual Studio IntelliSense 可帮助你捕获其中许多 JSON 错误,但是它不知道你是使用错误名称通过 inherits
还是 configurePreset
引用了预设。
若要检查预设文件是否有效,请在项目的根目录下通过命令行运行 cmake --list-presets
。 (需要 CMake 3.20 或更高版本。)如果其中一个文件无效,你将看到以下错误:
CMake Error: Could not read presets from
C:/Users/<user>/source/repos/<project-name>: JSON parse error
其他故障排除步骤包括:
- 删除缓存并重新配置项目(“CMake: 删除缓存”和“项目”>“配置 <project-name>”)。
- 关闭并重新打开 Visual Studio 中的文件夹(“文件”>“关闭文件夹”)。
- 删除项目根目录下的
.vs
文件夹。
如果发现了问题,则报告它的最佳方式是选择 Visual Studio 右上角的“发送反馈”按钮。
启用远程连接的日志记录
如果在将文件连接或复制到远程系统时遇到问题,可以为远程连接启用日志记录。 有关详细信息,请参阅远程连接的日志记录。
为 Windows 和 Linux 启用 AddressSanitizer
Visual Studio 支持 AddressSanitizer (ASAN),这是一个适用于 Windows 和 Linux 开发的 C 和 C++ 运行时内存错误检测器。 CMakeSettings.json
中的 addressSanitizerEnabled
选项可启用 AddressSanitizer。 不支持此行为CMakePresets.json
。
而是通过自行设置所需的编译器和链接器标志来启用和禁用 AddressSanitizer。 如果设置它们,则会删除 Visual Studio 特定的行为,并确保相同的 文件可从命令行重现你的生成CMakePresets.json
。
可以将下面的示例添加到 中,为目标启用或禁用 AddressSanitizerCMakeLists.txt
:
option(ASAN_ENABLED "Build this target with AddressSanitizer" ON)
if(ASAN_ENABLED)
if(MSVC)
target_compile_options(<target> PUBLIC /fsanitize=address)
else()
target_compile_options(<target> PUBLIC -fsanitize=address <additional-options>)
target_link_options(<target> PUBLIC -fsanitize=address)
endif()
endif()
<additional-options>
部分列出了其他编译标志(如 "-fno-omit-frame-pointer"
)。 若要详细了解适用于 Linux 的 AddressSanitizer ,请查看使用 AddressSanitizer。 有关如何将 AddressSanitizer 和 MSVC 结合使用的详细信息,请参阅从开发人员命令提示符使用 AddressSanitizer。
使用 中的 ASAN_OPTIONS
字段将运行时标志传递给 AddressSanitizerlaunch.vs.json
。 当未指定其他运行时选项时,ASAN_OPTIONS
默认为 detect_leaks=0
,因为 Visual Studio 不支持 LeakSanitizer。
通过命令行或 CI 管道运行 CMake
可以使用相同的 和 文件在 Visual Studio 中以及从命令行调用 CMakeCMakePresets.json
CMakeUserPresets.json
。 CMake 和 CTest 文档是通过 --preset
调用 CMake 和 CTest 的最佳资源。 需要 CMake 版本 3.20 或更高版本。
在 Windows 上使用命令行生成器进行生成时获取环境
在使用命令行生成器进行生成时,由用户先配置环境,再调用 CMake。 若要在 Windows 上使用 Ninja 和 Visual C++ 工具集进行生成,请在调用 CMake 来生成生成系统之前先设置环境。 为此,可使用 architecture
参数调用 vcvarsall.bat
。 architecture
参数指定要使用的主机体系结构和目标体系结构。 有关详细信息,请参阅 vcvarsall
语法。 若要在 Linux 或 Windows 上使用 Visual Studio 生成器进行生成,则无需执行此步骤。
这与 Visual Studio 在 IDE 调用 CMake 时所执行的步骤相同。 Visual Studio 为 toolset
和 architecture
指定的主机体系结构和目标体系结构分析当前活动的“配置预设”。 然后,Visual Studio 从 获取指定的环境vcvarsall.bat
。 使用 Ninja 从 Windows 命令行进行生成时,需要自行执行此步骤。
是随 Visual Studio 的生成工具一起安装的vcvarsall.bat
。 默认情况下,vcvarsall.bat
安装在 C:\Program Files (x86)\Microsoft Visual Studio\2019\<edition>\VC\Auxiliary\Build
中。 如果你经常使用命令行工作流,则可以将 添加到 PATH
中vcvarsall.bat
。
示例命令行工作流
可以使用下面的命令来配置和生成 CMake 项目,此项目使用 Ninja 将 x64 生成工具的目标定为 ARM64。 需要 CMake 版本 3.20 或更高版本。 在 文件所在的目录中运行这些命令CMakePresets.json
:
/path/to/vcvarsall.bat x64_arm64
cmake --list-presets=all .
cmake --preset <configurePreset-name>
cmake --build --preset <buildPreset-name>
示例 文件CMakePresets.json
box2d-lite 中的 文件包含配置预设、生成预设和测试预设的示例CMakePresets.json
。 有关此示例的详细信息,请观看此视频:CMakePresets.json 简介。 可以在 DirectXTK 项目中查看另一个示例,该示例的 configurePresets
部分显示了许多生成目标。
后续步骤
了解有关在 Visual Studio 中配置和调试 CMake 项目的更多信息: