背景
据我所知,在一个C++项目中:
_WIN32_WINNT
、WINVER
和NTDDI_VERSION
宏我的问题
如果我使用以下设置编译应用程序:
v140_xp
(VisualStudio2015-WindowsXP)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
.编译器不会产生任何错误或警告。
这让我想知道: Target Platform版本 for?是什么?
附加上下文
参考文献
编辑历史
发布于 2019-05-10 20:19:53
在Visual 2015中,目标平台版本字段只设置要使用的Windows版本。参考见这篇MSDN文章。在VisualStudio2019中,此字段已被重命名为Windows版本。您仍然需要设置_WIN32_WINNT
、WINVER
和NTDDI_VERSION
宏,以及Platform Toolset字段。综合起来,它们决定了应用程序可以运行的Windows版本。
如果您的应用程序需要在Windows上运行,则必须选择以结束的_xp平台工具集,选择一个较旧的Windows版本(您需要7.1A,但选择7.0或8.1应该可以运行;请参见下面),并相应地设置_WIN32_WINNT
、WINVER
和NTDDI_VERSION
宏。有关通过此堆栈溢出公告设置这些宏和包含相关SDK标头的技巧,请参见targetver.h
。
如果使用_xp平台工具集从命令提示符构建,请参阅此堆栈溢出公告获得关于设置/SUBSYSTEM
链接器选项和定义_USING_V110_SDK71_
的提示。
Windows是向后兼容的,但我还没有找到一个清晰的引用,其中列出了使用给定版本的Windows构建时可以针对的最老版本的Windows (请参阅本文底部的编辑)。每个SDK都列出了“系统需求”,但是这些列表列出了用SDK开发的Windows的最低版本,而不是用该SDK构建的可执行文件可以针对的最低版本的Windows。我所知道的最好的参考是每个较新的Windows中的sdkddkver.h
头。在此标头中包含_WIN32_WINNT版本常量的列表。例如,在Windows7.1A SDK中,sdkddkver.h
将_WIN32_WINNT_NT4
定义为最古老的受支持的Windows平台(但我不知道这是否是确定的)。
这个答案的其余部分是关于使用VisualStudio2019针对本机VC++应用程序的定位的说明。这些注释可能也适用于较早的Visual版本。
在VisualStudio2019中,选择以结束的平台工具集有一些特殊之处。对于v120_xp,Windows版本字段是隐藏的,但是继承的VC++目录将显示指定了WindowsSDK7.1A目录。对于v140_xp和v141_xp平台工具集,您可以选择WindowsSDK7.0或8.1 (对于这两种方法,继承的VC++目录都会显示指定了WindowsSDK7.1A目录)。
我不知道在VisualStudio2019中使用Platform Toolset v140_xp或v141_xp时,指定Windows版本的 7.0或8.1有什么区别。
在VisualStudio2019中,当为Windows应用程序设置本机C++项目属性时,取决于您选择的Platform Toolset,只读目标平台字段可能会更改为“Windows10”。但这并不意味着您的Win32桌面应用程序将作为一个通用Windows平台应用程序。根据平台工具集、Windows版本以及_WIN32_WINNT
、WINVER
和NTDDI_VERSION
宏的值,它仍然可以在旧版本的Windows上工作。
微软可以更新VS2019,以便目标平台字段值在为Win32 32/桌面项目设置属性时只显示"Windows“,而不管所选的平台工具集或Windows版本。
编辑:参见微软Xbox高级工程师Chuck的Windows简史一文,了解各种Windows向后兼容性的详细信息。
发布于 2019-09-24 13:27:46
下面概述Windows版本与平台工具集配置属性之间的差异。
Windows版本
重要:有时这个属性被称为Target Platform Version
值得庆幸的是,这个主题已经在微软的MSDN中更新了。以下内容直接取自C++项目属性页。
这指定了项目所需的( Windows )的版本。使用安装C++工作负载时,还会安装Windows所需的部分。如果计算机上有其他Windows版本,则已安装的每个版本的SDK工具都会出现在下拉列表中。 若要针对Windows 7或Windows,请使用值8.1,因为WindowsSDK8.1向后兼容这些平台。此外,您应该在the tver.h中为_WIN32_WINNT定义适当的值。对于Windows 7,这是0x0601。
对于那些不知道的人来说,任何给定的Windows基本上都是向后兼容的旧版本的Windows。例如,可以使用以下方法配置C++项目:
10
TargetVer.h
的头文件,该文件包括以下预处理宏:#define WINVER 0x0603 // Windows 8.1
#define _WIN32_WINNT 0x0603 // Windows 8.1
欲了解更多信息,请参见:
平台工具集
此属性为您的C++项目指定以下内容:
v142
会导致正在使用的VisualStudio2019编译器
v142
表示您正在使用VisualStudio2019 C++库MSVCRxxx.dll
)。
- `MSVCR`
- `MS` = Microsoft
- `V` = Visual
- `C` = C++
- `R` = Redistributable
- The redistributable is installed to:
- `C:\Windows\`
- `C:\Windows\SysWOW64\`
- Your application can determine which C++ library is being used by referencing the `_MSC_VER` pre-processor macro.
值得注意的是:
Platform Toolset
是一个项目级别设置(请参阅*.vcxproj
中的PlatformToolset
),而选中的Windows SDK Version
则保存在其他地方。Platform Toolset
值的名称可能会有些混淆,因为:v142
)与Visual发行版(例如Visual 2019年)相关联。
欲了解更多信息,请参见:
_MSC_VER
值及其含义的列表。
https://stackoverflow.com/questions/39621646
复制相似问题