【问题标题】:What does the `Target Platform Version` mean for a VS C++ project?“目标平台版本”对于 VS C++ 项目意味着什么?
【发布时间】:2017-01-30 00:06:42
【问题描述】:

背景

据我了解,在 C++ 项目中:

  • 项目属性 => 配置属性 => 常规 => 平台工具集
    • 告诉编译器要针对哪个 SDK 进行物理编译。
    • 例如:v140 将告诉 Visual Studio 2015 使用最新最好的 v8.1 Windows SDK
  • _WIN32_WINNTWINVERNTDDI_VERSION
    • 根据底层操作系统,SDK 函数的函数签名可能因操作系统而异。
    • SDK 应该是向后兼容的。 1
    • 前面提到的宏使您能够指定要针对哪个版本的函数进行编译。

我的问题

如果我使用以下设置编译我的应用程序:

  • 项目属性 => 配置属性 => 常规 => 平台工具集
    • 设置为:v140_xp(Visual Studio 2015 - Windows XP)
    • 设置告诉编译器使用 7.1 SDK,这是有道理的。
  • 内容:StdAfh.h
    • #include <WinSDKVer.h>
    • #define _WIN32_WINNT 0x0501
    • #define WINVER 0x0501
    • #define NTDDI_VERSION 0x05010000
    • #include <SDKDDKVer.h>
    • 宏告诉编译器使用哪些函数签名,这是有道理的。

据我所知,目标平台版本似乎是_WIN32_WINNTWINVERNTDDI_VERSION 宏的替代品。奇怪的是,通过上述配置,您可以将目标平台版本设置为199...,编译器不会产生任何错误或警告。

这让我想知道:目标平台版本是干什么用的?

附加上下文

  • 编译器:Visual Studio 2015

参考文献

编辑历史记录

  • 2016/09/21:根据 Hans 的评论,宏已更新为引用 Windows XP。

【问题讨论】:

  • 该设置仅在您想要使用 WinRT api(又名 UWP、又名现代 UI、又名商店应用程序)时产生影响。它决定了您将使用的合同版本(又名 .winmd 文件)。请注意,您的 stdafx.h 内容看起来很无聊,这可能是问题的真正原因。如果您希望您的应用程序仍然在 XP 上运行,那么使用 140_xp 工具集才有意义。在这种情况下,_WIN32_WINNT 应该是 0x501,这样您就不会意外使用仅在 Vista 及更高版本上可用的 winapi。
  • 140_xp 导致在编译时使用 Microsoft Windows SDK 7.1。我可能是错的,但我相信这个 SDK 最初是在 2010 年为 Windows 7 发布的。所以 WINVER = 0x0601 不应该吗?
  • 没有。它选择那个 SDK 版本,因为它是最后一个仍然与 XP 兼容的版本。
  • 您知道如何保证所有开发人员 PC 和构建机器在编译时使用相同的 SDK 100% 吗?理想情况下,我希望减少对“确保以正确的顺序安装这些软件包”的依赖,而更多地依赖“编译器要求 SDK v7.1 并在没有得到它时生成错误”。感谢您对此的指导。很难找到明确的答案。

标签: visual-c++ visual-studio-2015 sdk


【解决方案1】:

在 Visual Studio 2015 中,Target Platform Version 字段只是设置要使用的 Windows SDK 的版本。请参阅this MSDN article 以供参考。在 Visual Studio 2019 中,此字段已重命名为 Windows SDK 版本。您仍然需要设置 _WIN32_WINNTWINVERNTDDI_VERSION 宏,以及 Platform Toolset 字段。它们共同决定了您的应用可以运行的 Windows 版本。

如果您的应用程序需要在 Windows XP 上运行,您必须选择以 _xp 结尾的 Platform Toolset,选择较旧的 Windows SDK 版本(您需要 7.1A,但选择 7.0 或 8.1 应该可以工作;见下文),并相应地设置 _WIN32_WINNTWINVERNTDDI_VERSION 宏。有关设置这些宏以及通过targetver.h 包含相关 SDK 标头的提示,请参阅 this Stack Overflow posting

如果使用 _xp 平台工具集从命令提示符构建,请参阅 this Stack Overflow posting 以获取有关设置 /SUBSYSTEM 链接器选项和定义 _USING_V110_SDK71_ 的提示。

Windows SDK 是向后兼容的,但我还没有找到明确的参考资料,其中列出了使用给定版本的 Windows SDK 构建时可以定​​位的最旧的 Windows 版本。每个 SDK 都列出了“系统要求”,但这些列出了使用 SDK开发所需的最低 Windows 版本,而不是使用该 SDK 构建的可执行文件可以针对的最低 Windows 版本。我所知道的最佳参考是每个较新的 Windows SDK 中的 sdkddkver.h 标头。在此标头中是_WIN32_WINNT 版本常量 的列表。例如,在 Windows 7.1A SDK 中,sdkddkver.h_WIN32_WINNT_NT4 定义为最旧的受支持的 Windows 平台(但我不知道这是否是确定的)。

此答案的其余部分是关于使用 Visual Studio 2019 定位本机 VC++ 应用程序的说明。这些说明也可能适用于较旧的 Visual Studio 版本。


在 Visual Studio 2019 中,选择以 _xp 结尾的 Platform Toolset 有一些怪癖。对于 v120_xp,Windows SDK 版本 字段是隐藏的,但继承的 VC++ 目录 将显示指定了 Windows SDK 7.1A 目录。对于 v140_xp 和 v141_xp 平台工具集,您可以选择 Windows SDK 7.0 或 8.1(对于任何一个,继承的 VC++ 目录都会显示指定了 Windows SDK 7.1A 目录)。

我不确定在 Visual Studio 2019 中使用 Platform Toolset v140_xp 或 v141_xp 时指定 Windows SDK 版本 7.0 或 8.1 之间有什么区别 - 如果有的话。

在 Visual Studio 2019 中,为 Windows 桌面应用程序设置本机 C++ 项目属性时,根据您选择的平台工具集,只读目标平台字段可能更改为“Windows 10”。但这并不意味着您的 Win32 桌面应用程序将被构建为通用 Windows 平台应用程序。根据 Platform ToolsetWindows SDK 版本_WIN32_WINNTWINVERNTDDI_VERSION 宏的值,它仍可在旧版本的 Windows 上工作.

Microsoft 可以更新 VS2019,以便在为 Win32/桌面项目设置属性时,Target Platform 字段值将仅显示“Windows”,无论选择的是 Platform Toolset 还是 Windows SDK 版本。

【讨论】:

    【解决方案2】:

    以下总结了 Windows SDK 版本Platform Toolset 配置属性之间的区别。

    Windows SDK 版本

    重要提示:有时此属性称为Target Platform Version

    谢天谢地,此主题已在 Microsoft 的 MSDN 中更新。以下内容直接取自C++ project property pages

    这指定了您的项目所需的 Windows SDK 的版本。使用 Visual Studio 安装程序安装 C++ 工作负载时,还会安装 Windows SDK 的必需部分。如果您的计算机上有其他 Windows SDK 版本,您已安装的每个版本的 SDK 工具都会显示在下拉列表中。

    要面向 Windows 7 或 Windows Vista,请使用值 8.1,因为 Windows SDK 8.1 向后兼容这些平台。此外,您应该在 targetver.h 中为 _WIN32_WINNT 定义适当的值。对于 Windows 7,这是 0x0601。

    对于那些不知道的人,任何给定的 Windows SDK [大部分] 向后兼容旧版本的 Windows SDK。例如,您可以使用以下内容配置您的 C++ 项目:

    1. C++ 项目 => 属性 => 配置属性 => 常规
      • 目标平台版本 = 10
        • 此 SDK 使您能够利用 Windows 10 操作系统的功能。
    2. 将名为TargetVer.h 的头文件添加到您的项目中,其中包含以下预处理器宏:
      • #define WINVER 0x0603 // Windows 8.1
      • #define _WIN32_WINNT 0x0603 // Windows 8.1

    更多信息,请参见:

    平台工具集

    此属性为您的 C++ 项目指定以下内容:

    1. 编译器
      • 例如:v142 导致使用 Visual Studio 2019 编译器
    2. Visual C++ 库
      • 例如:v142 表示您正在使用 Visual Studio 2019 C++ 库
      • MSVCR
        • MS = 微软
        • V = 视觉
        • C = C++
        • R = 可再发行
      • 可再发行组件安装到:
        • C:\Windows\
        • C:\Windows\SysWOW64\
      • 您的应用程序可以通过引用 _MSC_VER 预处理器宏来确定正在使用哪个 C++ 库。

    值得注意的是:

    1. Platform Toolset 是项目级别设置(参见*.vcxproj 中的PlatformToolset),而选定的Windows SDK Version 保存在其他位置。
    2. Platform Toolset 值的名称可能有点令人困惑,因为:
      • 值(例如 v142)与 Visual Studio 版本相关联(例如 Visual Studio 2019
      • 您可以安装Build Tools,而不是安装Visual Studio IDE。这在使用构建机器时很有用。

    更多信息,请参见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-30
      • 2020-10-12
      • 1970-01-01
      • 2015-09-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-06
      • 1970-01-01
      相关资源
      最近更新 更多