【发布时间】:2017-01-30 00:06:42
【问题描述】:
背景
据我了解,在 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 Brokenness
- Target Platform Version general project property on VS2015
- Using the Windows Headers
- What is WINVER?
- Modifying WINVER and _WIN32_WINNT
- Visual Studio setting WINVER/_WIN32_WINNT to Windows 8 on Windows 7?
编辑历史记录
- 2016/09/21:根据 Hans 的评论,宏已更新为引用 Windows XP。
【问题讨论】:
-
该设置仅在您想要使用 WinRT api(又名 UWP、又名现代 UI、又名商店应用程序)时产生影响。它决定了您将使用的合同版本(又名 .winmd 文件)。请注意,您的 stdafx.h 内容看起来很无聊,这可能是问题的真正原因。如果您希望您的应用程序仍然在 XP 上运行,那么使用 140_xp 工具集才有意义。在这种情况下,_WIN32_WINNT 应该是 0x501,这样您就不会意外使用仅在 Vista 及更高版本上可用的 winapi。
-
140_xp导致在编译时使用 Microsoft Windows SDK 7.1。我可能是错的,但我相信这个 SDK 最初是在 2010 年为 Windows 7 发布的。所以WINVER=0x0601不应该吗? -
没有。它选择那个 SDK 版本,因为它是最后一个仍然与 XP 兼容的版本。
-
您知道如何保证所有开发人员 PC 和构建机器在编译时使用相同的 SDK 100% 吗?理想情况下,我希望减少对“确保以正确的顺序安装这些软件包”的依赖,而更多地依赖“编译器要求 SDK v7.1 并在没有得到它时生成错误”。感谢您对此的指导。很难找到明确的答案。
标签: visual-c++ visual-studio-2015 sdk