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



背景

据我所知,在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

参考文献

  • Windows SDK兄弟
  • VS2015上的目标平台版本常规项目属性
  • 使用Windows标头
  • 什么是WINVER
  • 修改WINVER和_WIN32_WINNT
  • Visual Studio是否在Windows 7上将WINVER/WIN32_WINNT设置为Windows 8

编辑历史记录

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

在Visual Studio 2015中,目标平台版本字段仅设置要使用的Windows SDK版本。请参阅MSDN的这篇文章以获取参考。在Visual Studio 2019中,此字段已重命名为Windows SDK版本。您仍然需要设置_WIN32_WINNTWINVERNTDDI_VERSION宏,以及平台工具集字段。总之,它们决定了你的应用程序可以运行的Windows版本。

如果您的应用程序需要在Windows XP上运行,则必须选择以_XP结尾的平台工具集,选择较旧的Windows SDK版本(您需要7.1A,但选择7.0或8.1应该有效;请参阅下文(,并相应地设置_WIN32_WINNTWINVERNTDDI_VERSION宏。有关设置这些宏以及通过targetver.h包含相关SDK头的提示,请参阅此Stack Overflow帖子。

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

Windows SDK是向后兼容的,但我还没有找到一个明确的参考,列出了在使用给定版本的Windows SDK构建时可以针对的最旧版本的Windows(请参阅本文底部的EDIT(。每个SDK列出";"系统要求";,但这些列出了使用SDK开发所需的最低版本的Windows,而不是使用该SDK构建的可执行程序可以针对的最低版本。据我所知,最好的参考是每个较新的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结尾的平台工具集有一些特殊之处。对于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中使用平台工具集v140_xp或v141_xp时指定Windows SDK版本7.0或8.1之间有什么区别(如果有的话(。

在Visual Studio 2019中,为Windows Desktop应用程序设置本机C++项目属性时,根据您选择的平台工具集,只读的Target Platform字段可能会更改为";Windows 10";。但这并不意味着你的Win32桌面应用程序将被构建为通用Windows平台应用程序。它仍然适用于较旧版本的Windows,具体取决于平台工具集Windows SDK版本以及_WIN32_WINNTWINVERNTDDI_VERSION宏的值。

微软可以更新VS2019,因此目标平台字段值将仅显示";Windows";设置Win32/桌面项目的属性时,无论选择的平台工具集Windows SDK版本

编辑:有关各种Windows SDK向后兼容性的详细信息,请参阅微软Xbox高级工程师Chuck Walbourn的文章《Windows SDK简史》。

以下总结了Windows SDK版本&平台工具集配置属性。

Windows SDK版本

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

值得庆幸的是,这个主题已经在微软的MSDN中更新了。以下内容直接取自C++项目属性页。

这指定项目所需的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。

对于那些不知道的人来说,任何给定的WindowsSDK都[主要]与WindowsSDK的旧版本向后兼容。例如,您可以用以下内容配置您的C++项目:

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

有关更多信息,请参阅:

  • SDKDDKVer.h的用途是什么
  • 修改WINVER和_WIN32_WINNT
    • 包括各种SDK的常量列表
  • 请参阅以下内容的摘要:Windows SDK选项

平台工具集

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

  1. 编译器
    • 例如:v142导致使用Visual Studio 2019编译器
  2. Visual C++库
    • 例如:v142表示您正在使用Visual Studio 2019 C++库
      • 这意味着,您的应用程序在部署过程中需要Visual Studio 2019 C++Redistributable(MSVCRxxx.dll(
    • MSVCR
      • MS=微软
      • V=可视
      • C=C++
      • R=可再分发
    • 可再发行软件安装到:
      • C:Windows
      • C:WindowsSysWOW64
    • 您的应用程序可以通过引用_MSC_VER预处理器宏来确定正在使用哪个C++库

值得注意的是:

  1. Platform Toolset是项目级设置(请参见*.vcxproj中的PlatformToolset(,而选定的Windows SDK Version则保存在其他位置
  2. Platform Toolset值的名称可能有些混乱,因为:
    • 该值(例如v142(与Visual Studio版本相关联(例如Visual Studio 2019(
    • 您可以安装生成工具,而不是安装Visual Studio IDE。这在使用构建机器时非常有用

有关更多信息,请参阅:

  • 请参阅以下内容的摘要:平台工具集选项
  • C++二进制兼容性和Visual Studio 2019的免费升级
  • 预定义的预处理器宏
    • 包括可能的_MSC_VER值及其含义的列表
  • 宣布推出Visual C++Build Tools 2015

最新更新