背景
据我了解,在 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
宏。奇怪的是,通过上述配置,您可以将 Target Platform Version 设置为 1
或 99
...并且编译器不会生成任何错误或警告。这让我想知道:目标平台版本的用途是什么?
附加背景
引用
编辑历史
最佳答案
在 Visual Studio 2015 中,目标平台版本 字段只是设置要使用的 Windows SDK 的版本。见 this MSDN article以供引用。在 Visual Studio 2019 中,此字段已重命名为 Windows SDK 版本 .你还需要设置_WIN32_WINNT
, WINVER
, 和 NTDDI_VERSION
宏,以及 平台工具集 field 。它们共同决定了您的应用程序可以运行的 Windows 版本。
如果您的应用程序需要在 Windows XP 上运行,您必须选择 平台工具集 以_xp 结尾,选择较旧的 Windows SDK 版本 (您需要 7.1A,但选择 7.0 或 8.1 应该可以;见下文),并设置 _WIN32_WINNT
, WINVER
, 和 NTDDI_VERSION
相应的宏。见 this Stack Overflow posting通过 targetver.h
获取有关设置这些宏和包括相关 SDK header 的提示.
如果使用 _xp 平台工具集从命令提示符构建,请参阅 this Stack Overflow posting有关设置 /SUBSYSTEM
的提示链接器选项和用于定义 _USING_V110_SDK71_
.
Windows SDK 是向后兼容的,但我还没有找到一个明确的引用资料,其中列出了使用给定版本的 Windows SDK 构建时可以定位的最旧的 Windows 版本(请参阅本文底部的编辑)。每个 SDK 都列出了“系统要求”,但这些列出了使用 SDK 开发所需的最低 Windows 版本,而不是使用该 SDK 构建的可执行文件可以针对的最低 Windows 版本。我所知道的最好的引用是sdkddkver.h
每个较新的 Windows SDK 中的 header 。在这个标题中是 的列表。 _WIN32_WINNT 版本常数 .例如,在 Windows 7.1A SDK 中,sdkddkver.h
定义 _WIN32_WINNT_NT4
作为最古老的受支持的 Windows 平台(但我不知道这是否是确定的)。
此答案的其余部分是有关使用 Visual Studio 2019 定位 native 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 目录)。
我不确定指定 之间有什么区别(如果有的话)。 Windows SDK 版本 使用 时为 7.0 或 8.1平台工具集 Visual Studio 2019 中的 v140_xp 或 v141_xp。
在 Visual Studio 2019 中,为 Windows 桌面应用程序设置 native C++ 项目属性时,取决于 平台工具集 您选择,只读目标平台字段可能会更改为“Windows 10”。但这并不意味着您的 Win32 桌面应用程序将被构建为通用 Windows 平台应用程序。根据 ,它仍然可以在旧版本的 Windows 上工作。平台工具集 , Windows SDK 版本 和 _WIN32_WINNT
的值, WINVER
, 和 NTDDI_VERSION
宏。
微软可以更新 VS2019,所以 目标平台为 Win32/桌面项目设置属性时,字段值将仅显示“Windows”,而不管选择的 平台工具集 或 Windows SDK 版本 .
编辑:见文章A Brief History of Windows SDKs微软 Xbox 高级工程师 Chuck Walbourn 提供了有关各种 Windows SDK 向后兼容性的详细信息。
关于visual-c++ - `Target Platform Version` 对 VS C++ 项目意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39621646/