背景
据我所知,在C++项目中:
- 项目属性=>配置属性=>常规=>平台工具集
- 告诉编译器要针对哪个SDK进行物理编译
- 例如:v140将告诉Visual Studio 2015使用最新和最棒的v8.1 Windows SDK
_WIN32_WINNT
、WINVER
和NTDDI_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_WINNT
、WINVER
和NTDDI_VERSION
宏的替代品。奇怪的是,使用上述配置,您可以将目标平台版本设置为1
或99
。。。并且编译器不会生成任何错误或警告。
这让我想知道:目标平台版本用于什么
附加上下文
- 编译器: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_WINNT
、WINVER
和NTDDI_VERSION
宏,以及平台工具集字段。总之,它们决定了你的应用程序可以运行的Windows版本。
如果您的应用程序需要在Windows XP上运行,则必须选择以_XP结尾的平台工具集,选择较旧的Windows SDK版本(您需要7.1A,但选择7.0或8.1应该有效;请参阅下文(,并相应地设置_WIN32_WINNT
、WINVER
和NTDDI_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_WINNT
、WINVER
和NTDDI_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++项目:
- C++项目=>属性=>配置属性=>常规
- 目标平台版本=
10
- 此SDK使您能够利用Windows 10操作系统的功能
- 目标平台版本=
- 将名为
TargetVer.h
的头文件添加到项目中,该头文件包含以下预处理器宏:#define WINVER 0x0603 // Windows 8.1
#define _WIN32_WINNT 0x0603 // Windows 8.1
有关更多信息,请参阅:
- SDKDDKVer.h的用途是什么
- 修改WINVER和_WIN32_WINNT
- 包括各种SDK的常量列表
- 请参阅以下内容的摘要:Windows SDK选项
平台工具集
此属性为您的C++项目指定以下内容:
- 编译器
- 例如:
v142
导致使用Visual Studio 2019编译器
- 例如:
- Visual C++库
- 例如:
v142
表示您正在使用Visual Studio 2019 C++库- 这意味着,您的应用程序在部署过程中需要Visual Studio 2019 C++Redistributable(
MSVCRxxx.dll
(
- 这意味着,您的应用程序在部署过程中需要Visual Studio 2019 C++Redistributable(
MSVCR
MS
=微软V
=可视C
=C++R
=可再分发
- 可再发行软件安装到:
C:Windows
C:WindowsSysWOW64
- 您的应用程序可以通过引用
_MSC_VER
预处理器宏来确定正在使用哪个C++库
- 例如:
值得注意的是:
Platform Toolset
是项目级设置(请参见*.vcxproj
中的PlatformToolset
(,而选定的Windows SDK Version
则保存在其他位置Platform Toolset
值的名称可能有些混乱,因为:- 该值(例如
v142
(与Visual Studio版本相关联(例如Visual Studio 2019( - 您可以安装生成工具,而不是安装Visual Studio IDE。这在使用构建机器时非常有用
- 该值(例如
有关更多信息,请参阅:
- 请参阅以下内容的摘要:平台工具集选项
- C++二进制兼容性和Visual Studio 2019的免费升级
- 预定义的预处理器宏
- 包括可能的
_MSC_VER
值及其含义的列表
- 包括可能的
- 宣布推出Visual C++Build Tools 2015