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 选项调用 CMake CMakePresets.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 配置、生成和测试”

    “工具”>“选项”已禁用 “工具”>“选项”已启用

    修改自动配置和缓存通知

    默认情况下,每次当前活动的“目标系统”或“配置预设”发生变化时,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 2019Visual 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 中,当你使用 clangclang-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.strategytoolset.strategy 设置为 set。 有关详细信息,请查看 CMake 生成器

    选择配置类型

    可以使用 cacheVariables.CMAKE_BUILD_TYPE 为单个配置生成器设置配置类型(DebugRelease)。 这等效于从命令行将 -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.strategytoolset.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.cmakeCMakePresets.json

    "cacheVariables": {
       "CMAKE_TOOLCHAIN_FILE": {
          "value": "$env{VCPKG_ROOT}/scripts/buildsystems/vcpkg.cmake",
           "type": "FILEPATH"
    

    VCPKG_ROOT 应设置为 vcpkg 安装的根目录。 有关详细信息,请查看 vcpkg 环境变量

    如果你已经在使用 CMake 工具链文件,并且想要启用 vcpkg 集成,请参阅使用多个工具链文件。 按照这些说明操作,以通过使用 vcpkg 将外部工具链文件与项目结合使用。

    launch.vs.jsontasks.vs.json 中的变量替换

    支持 和 中的变量替换CMakePresets.jsonlaunch.vs.jsontasks.vs.json。 下面是一些注意事项:

  • 活动配置预设中设置的环境变量会自动流向 和 配置launch.vs.jsontasks.vs.json。 可将各个环境变量设置为 null 来取消设置 和 中的各个环境变量launch.vs.jsontasks.vs.json。 以下示例在 中将变量 DEBUG_LOGGING_LEVEL 设置为 null"env": { "DEBUG_LOGGING_LEVEL": null }launch.vs.json

  • 活动配置预设中设置的键值可通过语法 ${cmake.<KEY-NAME>} 在 和 中使用launch.vs.jsontasks.vs.json。 例如,使用 ${cmake.binaryDir} 引用活动配置预设的输出目录。

  • 活动配置预设的环境映射中设置的各个环境变量可通过语法 ${env.<VARIABLE-NAME>} 在 和 中使用launch.vs.jsontasks.vs.json

    更新 和 文件以引用 语法而不是 语法launch.vs.jsontask.vs.jsonCMakePresets.jsonCMakeSettings.json。 当 作为活动配置文件时引用旧 语法的宏将在未来发布的版本中被弃用CMakeSettings.jsonCMakePresets.json。 例如,由于 使用 binaryDir 语法,可使用 ${cmake.binaryDir} 而不是 ${cmake.buildRoot} 来引用活动配置预设的输出目录CMakePresets.json

    如果没有按预期运行,则可以尝试一些故障排除步骤。

    如果 或 无效,则 Visual Studio 会回退到其默认行为,并只显示默认配置预设CMakePresets.jsonCMakeUserPresets.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.jsonCMakeUserPresets.jsonCMakeCTest 文档是通过 --preset 调用 CMake 和 CTest 的最佳资源。 需要 CMake 版本 3.20 或更高版本。

    在 Windows 上使用命令行生成器进行生成时获取环境

    在使用命令行生成器进行生成时,由用户先配置环境,再调用 CMake。 若要在 Windows 上使用 Ninja 和 Visual C++ 工具集进行生成,请在调用 CMake 来生成生成系统之前先设置环境。 为此,可使用 architecture 参数调用 vcvarsall.batarchitecture 参数指定要使用的主机体系结构和目标体系结构。 有关详细信息,请参阅 vcvarsall 语法。 若要在 Linux 或 Windows 上使用 Visual Studio 生成器进行生成,则无需执行此步骤。

    这与 Visual Studio 在 IDE 调用 CMake 时所执行的步骤相同。 Visual Studio 为 toolsetarchitecture 指定的主机体系结构和目标体系结构分析当前活动的“配置预设”。 然后,Visual Studio 从 获取指定的环境vcvarsall.bat。 使用 Ninja 从 Windows 命令行进行生成时,需要自行执行此步骤。

    是随 Visual Studio 的生成工具一起安装的vcvarsall.bat。 默认情况下,vcvarsall.bat 安装在 C:\Program Files (x86)\Microsoft Visual Studio\2019\<edition>\VC\Auxiliary\Build 中。 如果你经常使用命令行工作流,则可以将 添加到 PATHvcvarsall.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 项目的更多信息:

    Visual Studio 中的 CMake 项目
    自定义 CMake 生成设置
    配置 CMake 调试会话
    CMake 预定义配置引用

  •