在 Visual Studio 中使用 CMake 预设进行配置和生成

CMake 支持下面两个文件,便于用户指定通用的配置、生成和测试选项,并与他人共享: 和 CMakePresets.jsonCMakeUserPresets.json。 使用这些文件,可以在 Visual Studio 和 Visual Studio Code 中、在持续集成 (CI) 管道中以及通过命令行驱动 CMake。

用于保存项目范围内的生成CMakePresets.json。 可供开发人员用来保存自己的本地生成CMakeUserPresets.json。 这两个文件在 Visual Studio 2019 版本 16.10 或更高版本中都受到支持。

本文介绍了 与 Visual Studio 的集成CMakePresets.json。 以下是一些实用链接:

建议将 用作 的替代文件CMakePresets.jsonCMakeSettings.json。 Visual Studio 将永远不会同时从 CMakePresets.jsonCMakeSettings.json 中进行读取。 若要在 Visual Studio 中启用或禁用 集成,请参阅在 Visual Studio 2019 中启用 CMakePresets.jsonCMakePresets.json

支持的 CMake 和 CMakePresets.json 版本

受支持的 CMakePresets.jsonCMakeUserPresets.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.jsonCMakeUserPresets.json。 因此,当你在 Visual Studio 中使用 生成时,并不严格要求必须使用 CMake 版本 3.20 或更高版本CMakePresets.json

建议使用不低于 CMake 3.14 的版本。

在 Visual Studio 中启用 CMakePresets.json 集成

默认情况下,Visual Studio 中未启用 CMakePresets.json 集成。 可以在“工具”>“选项”>“CMake”>“常规”启用它:

显示已选中“始终使用CMakePresets.json”的屏幕截图。

可从 Visual Studio 2022 菜单访问此屏幕:“工具”>“选项”>“CMake”>“常规”。 该选项位于 CMake 配置文件部分下。

重要

关闭并重新打开 Visual Studio 中的文件夹,以激活集成。

在某些较旧版本的 Visual Studio 中,“工具”>“选项”>“CMake”>“常规”中只有一个选项可以启用 CMakePresets.json 集成:

旧版 Visual Studio 的屏幕截图。有一个复选框,标记为“使用 C 生成预设.json来驱动 CMake 配置、生成和测试。

下表指示何时使用 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.jsonCMakeUserPresets.json 文件,或者 CMakePresets.jsonCMakeUserPresets.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.jsonCMakePresets.json

配置和生成

在 Visual Studio 工具栏上,启用 CMakePresets.json 集成时,“目标系统”、“配置预设”和“生成预设”有下拉列表:

显示目标系统的下拉列表设置为“本地计算机”、“配置设置为 windows-arm64”和“生成预设”设置为默认值的屏幕截图。

选择“目标系统”

左侧的下拉列表表示当前活动的“目标系统”。 它是调用 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.jsonCMakeUserPresets.json

Visual Studio 将使用 Microsoft Visual Studio 设置供应商映射中的 hostOS 的值来隐藏不适用于活动目标系统的配置预设。 有关详细信息,请查看 Visual Studio 设置供应商映射下的表中的 hostOS 条目。

选择“管理配置”,打开项目根中的 文件CMakePresets.json。 如果 尚不存在,则创建该文件CMakePresets.json

选择一个生成预设

右侧的下拉列表表示当前活动的“生成预设”。 这是在调用 CMake 来生成项目时使用的 buildPreset 值。 此下拉列表包括在 和 中定义的非隐藏“生成预设”的并集CMakePresets.jsonCMakeUserPresets.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.jsonCMakeUserPresets.json

添加新的配置预设

若要将新的配置预设添加到 ,请在“解决方案资源管理器”的“文件夹视图”中右键单击 ,然后在快捷菜单中选择“添加配置”CMakePresets.jsonCMakePresets.json。 此时会显示用于选择配置预设模板的对话框:

“将配置预设添加到 JSON 文件”对话框的屏幕截图。它包含 Linux 调试、macOS 调试、x64 调试等条目。

选择要在 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_COMPILERcacheVariables.CMAKE_CXX_COMPILER 设置 C 和 C++ 编译器。 这相当于通过命令行将 -D CMAKE_C_COMPILER=<value>-D CMAKE_CXX_COMPILER=<value> 传递到 CMake。 有关详细信息,请参阅 CMAKE_<LANG>_COMPILER

使用以下示例,在 Visual Studio 中使用 cl.execlang-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 项目的更多信息: