据我了解,在C ++项目中:
_WIN32_WINNT
,WINVER
和NTDDI_VERSION
个宏
如果我使用以下设置编译我的应用程序:
v140_xp
(Visual Studio 2015 - Windows XP)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
...并且编译器不会生成任何错误或警告。
这让我想知道:什么是目标平台版?
答案 0 :(得分:1)
在Visual Studio 2015中,目标平台版本字段仅设置要使用的Windows SDK的版本。请参阅this MSDN article以供参考。在Visual Studio 2019中,此字段已重命名为 Windows SDK版本。您仍然需要设置_WIN32_WINNT
,WINVER
和NTDDI_VERSION
宏,以及 Platform Toolset 字段。它们共同决定了您的应用可以运行的Windows版本。
如果您的应用程序需要在Windows XP上运行,则必须选择一个以_xp结尾的 Platform Toolset ,选择一个较旧的 Windows SDK版本(您需要7.1A,但选择7.0或8.1应该可以;请参见下文),并相应地设置_WIN32_WINNT
,WINVER
和NTDDI_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_WINNT
,WINVER
和{ NTDDI_VERSION
宏。
Microsoft可以更新VS2019,因此在设置Win32 / desktop项目的属性时,无论选择了 Platform Toolset 还是< strong> Windows SDK版本。
答案 1 :(得分:0)
以下总结了 Windows SDK版本和 Platform Toolset 配置属性之间的区别。
重要:有时将此属性称为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 ++项目:
10
TargetVer.h
的头文件添加到您的项目中,该头文件包含以下预处理器宏:
#define WINVER 0x0603 // Windows 8.1
#define _WIN32_WINNT 0x0603 // Windows 8.1
有关更多信息,请参见:
此属性为您的C ++项目指定以下内容:
v142
导致使用 Visual Studio 2019 编译器v142
表示您正在使用Visual Studio 2019 C ++库
MSVCRxxx.dll
)。MSVCR
MS
=微软V
=视觉C
= C ++ R
=可再发行C:\Windows\
C:\Windows\SysWOW64\
_MSC_VER
预处理程序宏来确定使用哪个C ++库。值得注意的是:
Platform Toolset
是项目级别的设置(请参见PlatformToolset
中的*.vcxproj
),而所选的Windows SDK Version
保存在其他位置。Platform Toolset
值的名称可能会有些混乱,因为:
v142
)与Visual Studio版本(例如 Visual Studio 2019 )相关联有关更多信息,请参见: