CMP0149

在版本 3.27 中添加。

Visual Studio 生成器 默认选择最新的 Windows SDK。

Visual Studio 生成器选择一个 Windows SDK 版本,将其放入 WindowsTargetPlatformVersion 设置中 .vcxproj 文件。CMake 将 CMAKE_VS_WINDOWS_TARGET_PLATFORM_VERSION 变量设置为选定的 SDK 版本。

在 CMake 3.27 之前,SDK 版本始终是通过 CMAKE_SYSTEM_VERSION 变量的值选定的。用户或工具链文件可以将该变量设置为主机系统上可用的确切 Windows SDK 版本之一。由于 CMAKE_SYSTEM_VERSION 默认为 CMAKE_HOST_SYSTEM_VERSION,且无法保证提供匹配的 Windows SDK 版本,如果找不到确切匹配项,CMake 必须退而求其次使用最新的 Windows SDK 版本。这种方法存在问题

  • 最新 Windows SDK 可能选择或不选择,具体取决于 Windows 主机版本是否正好与某个可用 SDK 版本匹配。

  • 可能会选择尚未针对较新的语言标准(如 C11)进行更新的旧版 Windows SDK。

CMake 3.27 及更高版本更喜欢忽略 CMAKE_SYSTEM_VERSION 的确切值,并且默认选择可用的最新 SDK 版本。可以使用 CMAKE_GENERATOR_PLATFORM 变量中的 version= 字段显式指定确切的 SDK 版本。请参见 Visual Studio Platform Selection(Visual Studio 平台选择)。

此策略为项目、工具链文件和构建脚本提供了兼容性,这些脚本和文件尚未从使用 CMAKE_SYSTEM_VERSION 指定确切的 SDK 版本转换而来。

注意

此策略必须在项目最顶层的第一个 project()enable_language() 命令调用之前进行设置。即在 Visual Studio 生成器 选择 Windows SDK 时。

此策略的 OLD 行为是尽可能使用 CMAKE_SYSTEM_VERSION 的确切值。此策略的 NEW 行为是忽略它。

此策略在 CMake 版本 3.27 中引入。它可以通过 cmake_policy()cmake_minimum_required() 进行设置。如果未设置,CMake 不会发出警告,并使用 OLD 行为。

注意

一项策略的 OLD 行为 默认情况下已弃用,并且可能在将来某个版本的 CMake 中删除。