Windows Kits是什么?它们是如何工作的?

19
在以前的日子里,当在Visual Studio上开发Windows的C++项目时,你的Visual Studio版本会有自己的C和C++库版本,你的项目将引用特定版本的Windows SDK来访问用于访问Win32平台的头文件。如果你安装了多个版本的Windows SDK,则需要使用涉及环境变量的复杂系统来选择默认情况下Visual Studio将使用哪个版本的Windows SDK。
这不是很好,让它正常工作需要一些挖掘,但它几乎可以正常工作。
我刚刚从VS2012升级到VS2015,对我来说,无论这个系统被替换成什么东西,要么就是彻底坏了,要么我只是没有理解它。
  • 将包括conio.h在内的简单VS2012 C++控制台应用程序升级到VS2015时出现错误,但没有报错。为什么?conio.h不再位于Visual Studio C/C++库中,而是现在存在于Windows Kit 10中,升级项目不会重新设置使用的SDK(如您所期望的)。
  • 在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中提取头文件。
因此,简单的项目升级失败了,但没有报错。新的干净控制台项目同时从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 Kit 10包含C/C++头文件。
我是否安装配置错误或损坏,还是这个混乱就是它应该的样子?

如果这个混乱的状态是预期的,那么它是如何工作的?我尝试在MSDN上搜索关于Windows Kits的信息,但除了与Windows Driver Kit有关的内容外,什么也没有找到,而Windows Driver Kit以前是完全不同的东西,但我不知道现在是否还是。

是否有任何我错过的文档可以解释这个库配置背后的原理以及它的预期使用方式?


8
Microsoft有一个非常苛刻和要求苛刻的客户,它就是Microsoft自己。政治很无聊,解决不了任何人的问题。你只需要修复项目 > 属性 > VC++目录 > 包含目录。将其还原为$(VC_IncludePath);$(WindowsSDK_IncludePath),这样可以评估到5个目录。那可能会破坏你的项目,请改用C/C++ > 常规 > 附加包含目录设置。 - Hans Passant
很抱歉,我有些难以理解哪些部分是你需要解决的问题,哪些部分只是你在抱怨的问题。如果您能提供一个简单的代码示例,那可能会有所帮助。 - Sam Hobbs
4
我想了解Windows Kits与旧版Windows SDK的关系以及如何配置项目以适应不同版本。这是一个Visual Studio项目配置问题,不是代码问题。如果你不理解或不感兴趣也没关系,但请不要因此关闭我的问题。如果有好的答案出现,那对其他人仍然非常有用。 - Neutrino
如果您希望这对他人有所帮助,请确保您的问题清晰明了(请参见[提问])。目前的写法并不是很清楚,您想要什么。如何正确地将解决方案从VS 2012升级到2015?如何验证您的构建系统是否设置正确?应该如何使用Windows SDK头文件?如何使用特定的SDK进行构建?是否有可用的文档? - IInspectable
1个回答

7
我已经遇到了这个问题的几个不同变体,对于从VS2012升级到VS2015的项目,无论是解决头文件还是库依赖问题都存在问题。
Hans在回答我的问题时确实解决了头文件的问题,但是在遇到相同的库依赖问题后,我找到了一个可能更简单的解决方案,可以解决无法解析的库依赖项。
在VS2015中打开VS2012项目时不会自动升级。打开项目属性并将“常规”->“平台工具集”更改为Visual Studio 2015(v140)可能会再现原始问题中描述的头文件解析错误的变体,或者是一个不同的库依赖项解决错误。
我发现最简单的解决方法是打开项目属性并转到VC++目录->包含目录。在您可能已经添加到项目中的任何路径中,您可能会发现$(VCInstallDir)\include;$(VCInstallDir\atlmfc\include;$(WindowsSDK_IncludePath)

单击该路径以显示下拉列表,并单击编辑,这将显示一个对话框,其中包含三个部分,从上到下明确定义的路径、评估的路径和继承的路径。在最底部是一个复选框“从父项或项目默认值继承”,我发现它通常未被选中。
从明确定义的包含路径中删除上述$(VCInstallDir)\include;$(VCInstallDir\atlmfc\include;$(WindowsSDK_IncludePath)条目,并选择“从父项或项目默认值继承”设置,这应该解决任何头文件依赖性问题。
如果您还有库引用问题,请使用Library Directory条目执行相同的操作,编辑设置,删除显式平台条目,然后选择“从父项或项目默认值继承”。(即使您没有看到任何链接器错误,也最好这样做,否则您可能会在链接到VS2012库时使用平台工具集编译器选项)。
我不知道为什么我会遇到这个问题,而其他人却没有遇到类似的问题。之前我没有升级过Visual Studio解决方案的问题。
我还没有发现为什么某些Windows Kits版本现在包含Windows平台头文件或C++库头文件,而之前的SDK始终包含平台头文件,而C++头文件则始终是Visual Studio安装的一部分。这种变化似乎应该在某个地方有一个开发博客或其他文档记录。但只要它有效,我就不太关心。
希望这能帮助某些人。

我也不知道为什么某些版本的Windows Kits现在包含Windows平台头文件或C++库头文件,而C++头文件一直是Visual Studio安装的一部分。我认为,在早期升级VS时,它会同时升级您程序的MFC库、编译器、VS GUI等。这对于新程序来说很好,但旧程序由于不同的Windows头文件导致参数错误,由于编译器差异导致语言错误等。我猜测这种变化是为了提高C++库和VS GUI的灵活性而进行的解耦。 - Ivan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接