什么是 Windows 工具包以及它们如何工作
What are Windows Kits and how do they work?
中在Windows上开发C++项目时,Visual Studio版本将具有自己的C和C++库版本,并且您的项目将引用特定版本的Windows SDK,以便访问访问Win32平台的标头。如果您安装了多个版本的Windows SDK,则会出现一个复杂的系统,涉及环境变量,使您能够选择Visual Studio默认使用的Windows SDK Version。
它不是很好,让它正常工作需要一些挖掘,但它只是工作。
刚刚从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 工具包安装中提取标头,我现在在 C:\Program Files (x86)\Microsoft SDK 和 C:\Program Files (x86)\Windows Kits 下有 8.1 和 10 的条目。Windows Kit 8.1 包含 Win32 和 WinRt 标头,而 Windows Kit 10 包含 C/C++ 标头。
我是否有配置错误和损坏的安装,或者这种混乱是应该的?
如果这种混乱是它应该的样子,那么它打算如何运作?我尝试在MSDN上搜索有关Windows套件的信息,但除了有关Windows驱动程序工具包的内容外,什么也没找到,这曾经是完全不同的东西,但我不知道它是否仍然如此。
有没有我错过的文档来解释此库配置背后的基本原理以及它的使用方式?
这个问题的几种不同变体,解决了从VS2012升级到VS2015的项目上的头文件和库依赖项的问题。
Hans 在回答我的问题时的评论确实解决了标头的问题,但在遇到库依赖项的相同问题后,我有一个更简单的解决方案,也适用于失败的库依赖项解析。
在VS2015中打开VS2012项目时,不会执行自动升级。打开项目属性并将常规 -> 平台工具集更改为 Visual Studio 2015 (v140) 可能会重现我的原始问题中描述的标头解析错误的变体或其他库依赖项解析错误。
我发现解决这些问题的最简单方法是打开项目属性并转到 VC++ 目录 -> 包含目录。在你自己添加到项目的任何路径中,你可能会发现$(VCInstallDir)\include;$(VCInstallDir\atlmfc\include;$(WindowsSDK_IncludePath)
单击路径以显示下拉列表并单击编辑,这将显示一个对话框,其中包含三个部分,从上到下,显式定义的路径,评估的路径和继承的路径。最底部是一个复选框"从父项或项目默认值继承",我一直发现它最初未选中。
从显式定义的包含路径中删除上述 $(VCInstallDir)\include;$(VCInstallDir\atlmfc\include;$(WindowsSDK_IncludePath) 条目,然后选择"从父项或项目默认值继承"设置。这应该可以解决任何头文件依赖问题。
如果您也有库引用问题,请对库目录条目执行相同的操作,编辑设置,删除显式平台条目,然后选择"从父项或项目默认值继承"。(即使您没有看到任何链接器错误,这样做也可能是一个好主意,否则您最终可能会在链接到 VS2012 的库时使用 VS2015 的平台工具集编译器选项)。
我不知道为什么当我没有遇到其他有类似问题的人时,这对我来说是搞砸的,我以前在升级 Visual Studio 解决方案时没有遇到过问题。
我也没有发现为什么某些版本的Windows工具包现在包含Windows平台标头或C++库标头,而以前SDK始终包含平台标头,而C++标头始终是Visual Studio安装的一部分。似乎像这样的更改应该在某处有一个关于它的开发博客或其他一些文档。但只要它有效,那么我就不太在乎。
我希望这对某人有所帮助。
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 有人能解释一下为什么下界是这样工作的吗C++的
- ExtractIconEx:可以工作,但偶尔会崩溃
- C++中的memset函数工作不正常
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 链表c++插入,所有情况都已检查,但没有任何工作
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?