首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >“目标平台版本”对于VS C++项目意味着什么?

“目标平台版本”对于VS C++项目意味着什么?
EN

Stack Overflow用户
提问于 2016-09-21 16:14:27
回答 2查看 19.7K关注 0票数 18

背景

据我所知,在一个C++项目中:

  • 项目属性=>配置属性=>通用=>平台工具集
    • 告诉编译器要对哪个SDK进行物理编译。
    • 例如: v140将告诉VisualStudio2015使用最新和最伟大的v8.1WindowsSDK

  • _WIN32_WINNTWINVERNTDDI_VERSION
    • 根据底层操作系统的不同,SDK函数可以有不同的功能签名,从OS到OS。
    • SDK应该是向后兼容的。1
    • 前面提到的宏使您能够指定要针对哪个函数进行编译的版本。

我的问题

如果我使用以下设置编译应用程序:

  • 项目属性=>配置属性=>通用=>平台工具集
    • 设置为:v140_xp (VisualStudio2015-WindowsXP)
    • 设置告诉编译器使用7.1SDK,这是有意义的。

  • 内容:StdAfh.h
    • #include <WinSDKVer.h>
    • #define _WIN32_WINNT 0x0501
    • #define WINVER 0x0501
    • #define NTDDI_VERSION 0x05010000
    • #include <SDKDDKVer.h>
    • 宏告诉编译器要使用哪个函数签名,这是有意义的。

据我所知,目标平台版本似乎是一个适合于替代_WIN32_WINNTWINVERNTDDI_VERSION宏的版本。奇怪的是,使用上面的配置,您可以将目标平台版本设置为199.编译器不会产生任何错误或警告。

这让我想知道: Target Platform版本 for?是什么?

附加上下文

  • 编译器: Visual 2015

参考文献

编辑历史

  • 2016/09/21:根据Hans的评论,宏已经更新为引用Windows。
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-05-10 20:19:53

在Visual 2015中,目标平台版本字段只设置要使用的Windows版本。参考见这篇MSDN文章。在VisualStudio2019中,此字段已被重命名为Windows版本。您仍然需要设置_WIN32_WINNTWINVERNTDDI_VERSION宏,以及Platform Toolset字段。综合起来,它们决定了应用程序可以运行的Windows版本。

如果您的应用程序需要在Windows上运行,则必须选择以结束的_xp平台工具集,选择一个较旧的Windows版本(您需要7.1A,但选择7.0或8.1应该可以运行;请参见下面),并相应地设置_WIN32_WINNTWINVERNTDDI_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_WINNTWINVERNTDDI_VERSION宏的值,它仍然可以在旧版本的Windows上工作。

微软可以更新VS2019,以便目标平台字段值在为Win32 32/桌面项目设置属性时只显示"Windows“,而不管所选的平台工具集Windows版本

编辑:参见微软Xbox高级工程师Chuck的Windows简史一文,了解各种Windows向后兼容性的详细信息。

票数 12
EN

Stack Overflow用户

发布于 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++项目:

  1. C++项目=>属性=>配置属性=> General
    • 目标平台版本= 10
      • 此SDK使您能够利用Windows 10操作系统的功能。

  1. 向项目中添加一个名为TargetVer.h的头文件,该文件包括以下预处理宏:
    • #define WINVER 0x0603 // Windows 8.1
    • #define _WIN32_WINNT 0x0603 // Windows 8.1

欲了解更多信息,请参见:

平台工具集

此属性为您的C++项目指定以下内容:

  1. 编译器
    • 例如:v142会导致正在使用的VisualStudio2019编译器

  1. VisualC++库
    • 例如:v142表示您正在使用VisualStudio2019 C++库

代码语言:javascript
运行
复制
- `MSVCR` 
    - `MS` = Microsoft
    - `V` = Visual
    - `C` = C++
    - `R` = Redistributable

代码语言:javascript
运行
复制
- The redistributable is installed to:  
    - `C:\Windows\`
    - `C:\Windows\SysWOW64\`

代码语言:javascript
运行
复制
- Your application can determine which C++ library is being used by referencing the `_MSC_VER` pre-processor macro.

值得注意的是:

  1. Platform Toolset是一个项目级别设置(请参阅*.vcxproj中的PlatformToolset ),而选中的Windows SDK Version则保存在其他地方。
  2. Platform Toolset值的名称可能会有些混淆,因为:
    • 该值(例如v142)与Visual发行版(例如Visual 2019年)相关联。
    • 与其安装Visual,不如安装构建工具。这在使用构建机器时很有用。

欲了解更多信息,请参见:

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39621646

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档