什么是Windows套件以及它们如何工作?

时间:2016-04-25 13:47:34

标签: c++ windows winapi visual-studio-2012 visual-studio-2015

在Visual Studio中在Windows上开发C ++项目的过去,您的Visual Studio版本将拥有自己的C和C ++库版本,您的项目将引用特定版本的Windows SDK以便访问用于访问Win32平台的标头。如果安装了多个版本的Windows SDK,则会出现一个涉及环境变量的复杂系统,使您可以选择默认情况下将使用哪个版本的Windows SDK Visual Studio。

这不是很好,让它正常工作需要一些挖掘,但它只是工作。

刚刚从VS2012升级到VS2015,在我看来,无论这个系统被替换了什么都是彻头彻尾的破坏,或者我只是不理解它。

  1. 将包含conio.h的简单VS2012 C ++控制台应用程序升级到VS2015,并且没有报告错误。为什么? conio.h不再位于Visual Studio C / C ++库中,而是现在位于Windows Kit 10中,升级项目不会重置所使用的SDK(正如您所期望的那样)。

  2. 在VS2015中创建一个全新的Hello World C ++应用程序C ++项目包括目录继承$(VC_IncludePath)和$(WindowsSDK_IncludePath)。 $(WindowsSDK_IncludePath)从C:\ Program Files(x86)\ Windows Kits \ 8.1中提取标题,而$(VC_IncludePath)从C:\ Program Files(x86)\ Windows Kits \ 10中提取标题。

  3. 如此简单的项目升级失败,升级时未报告错误。清理新的控制台项目同时从2个不同的Windows Kit安装中提取标题,现在我在C:\ Program Files(x86)\ Microsoft SDKs和C:\ Program Files(x86)\ Windows Kits下有8.1和10的条目。 Windows Kit 8.1包含Win32和WinRt标头,而Windows套件10包含C / C ++标头。

    我是否有错误配置和损坏的安装,或者这应该是怎么回事?

    如果这个混乱是应该如何,这是如何工作的?我已经尝试在MSDN上搜索有关Windows套件的信息,但除了关于Windows驱动程序工具包的内容之外什么都没有,这曾经是完全不同的东西,但我不知道它是否仍然存在。

    是否有任何我遗漏的文档解释了这个库配置背后的理由以及它是如何使用的?

1 个答案:

答案 0 :(得分:4)

我已经多次碰到这个问题的几个不同版本,问题解决了从VS2012升级到VS2015的项目的头文件和库依赖项。

汉斯'回答我的问题的评论确实解决了标题的问题,但在遇到与库依赖关系相同的问题后,我有一个更简单的解决方案,也适用于失败的库依赖关系解析。

在VS2015中打开VS2012项目时,不会执行自动升级。打开项目属性并更改常规 - > Visual Studio 2015(v140)的平台工具集可能会重现我原始问题中描述的标题解析错误的变体或不同的库依赖项解析错误。

我发现解决这些问题的最简单方法是打开项目属性并转到VC ++目录 - >包括目录。在您自己添加到项目中的任何路径中,您可能会找到$(VCInstallDir)\ include; $(VCInstallDir \ atlmfc \ include; $(WindowsSDK_IncludePath)

单击路径以显示下拉列表并单击编辑,这将显示一个对话框,其中包含三个部分,从上到下,显式定义的路径,已评估的路径和继承的路径。在最底部是一个复选框'从父项或项目默认值继承'我总是发现它最初没有被检查。

从显式定义的包含路径中删除上面描述的$(VCInstallDir)\ include; $(VCInstallDir \ atlmfc \ include; $(WindowsSDK_IncludePath)条目,并选择“从父​​项或项目默认设置继承'设置那应该解决任何头文件依赖问题。

如果您还有库引用问题,请对库目录条目执行相同操作,编辑设置,删除显式平台条目,然后选择“从父​​级或项目默认值继承”#39;。 (即使您没有看到任何链接器错误,这样做也许是个好主意,否则您可能会在链接到VS2012的库时最终使用VS2015的平台工具集编译器选项。)

我不知道为什么当我遇到其他遇到类似问题的人时,为什么会搞这个问题,我以前在升级Visual Studio解决方案时遇到了问题。

我还没有发现为什么某些版本的Windows套件现在包含Windows平台标头或C ++库标头,而之前SDK始终包含平台标头,而C ++标头始终是部分或Visual Studio安装。看起来像这样的变化应该有关于它的开发博客或其他一些文档。但只要它有效,那我就不会太在意。

我希望这有助于某人。