缘起
前一段时间,有网友遇到一个奇怪的问题,说他机器上的 vs2019
编译 C++
工程报错。我当时一听就有两个怀疑:
- 工程设置不对。
vs2019
没装好。
因为新建一个最简单的工程,编译也报一样的错误,所以可以排除工程设置的问题了。那只有可能是 vs2019
的问题了。但是具体是哪里的问题呢?
他按照错误提示搜索到了如下链接:
根据链接里的提示,做过尝试,没能解决问题。后来在我们沟通的过程中,他自己解决了问题,这不就是大名鼎鼎的橡皮鸭调试法吗?当他的问题解决后,我特意在本地重现了整个过程,做了一些调查,整理成本文,分享给大家。
编译受阻
我用 vs2019
新建了一个最简单的 Hello world
工程,编译,报错如下:
Error MSB8037 The Windows SDK version 10.0.18362.0 for Desktop C++ x86 Apps was not found. Install the required version of Windows SDK or change the SDK version in the project property pages or by right-clicking the solution and selecting "Retarget solution".
更直观的报错截图如下:
问题排查
既然提示找不到对应版本的 SDK
,那么先到工程属性里看一下对应的配置。在工程上,右键
-> 属性
。在工程属性对话框中选择 Configuration Properties
下的 General
。在右侧查看 Windows SDK Version
的值,确实是 10.0.18362.0
,如下图。
本地搜一下10.0.18362.0
,看看本地是否存在相关的路径。
本地也存在相关路径。能想到的可以怀疑的地方都排除了。接下来请出我们的老朋友 —— process monitor
。
深入调查
打开 process monitor
,开启监视,在 vs
中开始编译,问题重现后,停止监视。
下面就要进行最重要的步骤了—— 过滤。
使用 process monitor
快速解决问题的关键在于过滤出与问题有关的事件!
我们需要根据什么条件过滤呢?
一般操作结果是成功的事件对我们帮助不大,所以首先过滤掉 Result
是 SUCCESS
的事件。
既然提示的是找不到 10.0.18362.0
版本的 SDK
,相关错误应该和 10.0.18362.0
有关,所以只保留 Path
中包含 10.0.18362.0
的记录。
没想到,效果这么好,只有六条。
其中,有两条是注册表中找不到 HKLM\Software\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0.18362.0
(这个注册表项不是必须存在的,在能正常编译的机器上也可能找不到),最后一条是找不到文件 C:\Program Files (x86)\Windows Kits\10\Include\10.0.18362.0\shared\sdkddkver.h
。看来,应该是我本地少了这个文件。因为我故意把这个文件重名了,改回来,重新编译,搞定。
具体调查过程请参考下面的屏幕录像。
后记
跟这位网友沟通的整个过程特别顺畅,省心。他已经根据线索在网上搜索了相关资料,自己摸索了一番。怀疑哪里有问题,立刻能查看相关的配置进行排查。最后,在沟通的过程中,他自己就把问题解决了。原来,他在前几天把一些文件的位置给改了,改回来就好了。后来聊天得知,他才大二,后生可畏!
总结
在帮网友解决问题的过程中,我扮演的角色其实类似 “橡皮鸭”。也希望大家遇到问题时,把问题描述给周围的人,也许自己就知道问题出在哪了。屡试不爽!