“目标平台版本”对于VS C ++项目意味着什么?

时间:2016-09-21 16:14:27

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

背景

据我了解,在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&#39;注释,宏已更新为引用Windows XP。

2 个答案:

答案 0 :(得分:1)

在Visual Studio 2015中,目标平台版本字段仅设置要使用的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宏。

Windows SDK向后兼容,但是我还没有找到明确的参考资料,其中列出了使用给定版本的Windows SDK构建时可以定​​位的最旧版本的Windows。每个SDK都列出了“系统要求”,但是这些列表列出了使用该SDK 开发所需的最低Windows版本,而不是使用该SDK生成的可执行文件可以定位的最低Windows版本。

Microsoft可以通过发布每个Windows SDK版本和Platform Toolset组合可定位的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之间有什么区别- / p>

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

Microsoft可以更新VS2019,因此在设置Win32 / desktop项目的属性时,无论选择了 Platform Toolset 还是< strong> Windows SDK版本。

答案 1 :(得分:0)

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

Windows SDK版本

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

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

  

这指定了项目所需的Windows SDK版本。当您使用Visual Studio安装程序安装C ++ Workload时,还将安装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是项目级别的设置(请参见PlatformToolset中的*.vcxproj),而所选的Windows SDK Version保存在其他位置。
  2. Platform Toolset值的名称可能会有些混乱,因为:
    • 该值(例如v142)与Visual Studio版本(例如 Visual Studio 2019 )相关联
    • 可以安装Build Tools而不是安装Visual Studio IDE。在使用构建计算机时,这很有用。

有关更多信息,请参见: