visual-c++ - `Target Platform Version` 对 VS C++ 项目意味着什么?

标签 visual-c++ visual-studio-2015 sdk

背景
据我了解,在 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宏。奇怪的是,通过上述配置,您可以将 Target Platform Version 设置为 199 ...并且编译器不会生成任何错误或警告。
    这让我想知道:目标平台版本的用途是什么?
    附加背景
  • 编译器: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。
  • 最佳答案

    在 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/

    相关文章:

    asp.net-mvc - 将MVC添加到VS2015中的空ASP.NET 5项目: Empty 500 Responses

    visual-studio - Visual Studio 2015 从 SQL Server 2012 LocalDB 迁移数据库 - 登录时出错

    android - "the chosen operation is not currently available"

    c++ - 使用预训练的 caffe 模型进行图像分类

    c++ - 我应该对引用使用 __restrict 吗?

    c++ - 如何更改静态链接库中 const 字符串数组的 Visual Studio C++ 初始化顺序

    visual-studio-2015 - 为什么 Resharper 无法在空的 MSVS 2015 控制台应用程序中检测到未使用的引用?

    android - 因为来自 sdk 的 flutter_test 的每个版本都依赖于路径 1.8.1,而 easy_localization 3.0.0 依赖于路径 >=1.8.0-nullsafety

    iphone - 沿着预定路径移动图像?

    c++ - 如何从文件中读取行并将其切割成碎片?