缘起
前一段时间,有网友遇到一个奇怪的问题,说他机器上的 vs2019
编译 C++
工程报错。我当时一听就有两个怀疑:
工程设置不对。
vs2019
没装好。
因为新建一个最简单的工程,编译也报一样的错误,所以可以排除工程设置的问题了。那只有可能是 vs2019
的问题了。但是具体是哪里的问题呢?
他按照错误提示搜索到了如下链接:
https://developercommunity.visualstudio.com/content/problem/761788/msb8036-the-windows-sdk-version-100183620-was-not.html
根据链接里的提示,做过尝试,没能解决问题。后来在我们沟通的过程中,他自己解决了问题,这不就是大名鼎鼎的橡皮鸭调试法吗?当他的问题解决后,我特意在本地重现了整个过程,做了一些调查,整理成本文,分享给大家。
编译受阻
我用 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
。看来,应该是我本地少了这个文件。因为我故意把这个文件重名了,改回来,重新编译,搞定。
具体调查过程请参考下面的屏幕录像。
后记
跟这位网友沟通的整个过程特别顺畅,省心。他已经根据线索在网上搜索了相关资料,自己摸索了一番。怀疑哪里有问题,立刻能查看相关的配置进行排查。最后,在沟通的过程中,他自己就把问题解决了。原来,他在前几天把一些文件的位置给改了,改回来就好了。后来聊天得知,他才大二,后生可畏!
总结
在帮网友解决问题的过程中,我扮演的角色其实类似 “橡皮鸭”。也希望大家遇到问题时,把问题描述给周围的人,也许自己就知道问题出在哪了。屡试不爽!
猜你喜欢:
VS 系列:
排错实战——解决c++编译错误:error C2059: illegal token on right side of '::'
善用 vs 中的错误列表和输出窗口,高效查找 C++ 多工程编译错误
转储文件系列:
转储系列文章总结
转储文件知多少
你需要知道的 N 种抓取 dump 的工具
你生成的转储文件有问题吗?
向大厂看齐!为自己的程序增加自动转储的功能!
内核转储,开抓啦!
蓝屏(BSOD)转储设置,看本文就够了!
系统蓝屏的几种姿势,确定不了解下么?
本地内核调试环境搭建,就这么简单!
双机内核调试 101
使用 VMware + win10 + VirtualKD + windbg 从零搭建双机内核调试环境
使用 VMware + win10 + vs2019 从零搭建双机内核调试环境
本地内核调试神器 —— livekd 使用总结
调试系列:
调试实战——你知道怎么使用DebugView查看调试信息吗?
调试实战——程序CPU占用率飙升,你知道如何快速定位吗?
调试实战——崩溃在ComFriendlyWaitMtaThreadProc
调试实战——使用windbg调试崩溃在ole32!CStdMarshal::DisconnectSrvIPIDs
调试实战——调试PInvoke导致的内存破坏
调试实战——调试excel启动时死锁
调试实战——调试DLL卸载时的死锁
调试实战——调试TerminateThread导致的死锁
调试实战——从堆里找回“丢失”的代码
调试实战——从堆里找回“丢失”的代码相关命令简介
排错系列:
排错实战——1分钟解救 run 不出来的 Autoruns
排错实战——VS清空最近打开的工程记录
排错实战——拯救加载调试符号失败的IDA
排错实战——你知道拖动窗口时只显示虚框怎么设置吗?
排错实战——解决Tekla通过.tsep安装插件失败的问题
排错实战——使用process explorer替换任务管理器
排错实战——通过对比分析sysinternals事件修复程序功能异常
欢迎留言交流
需要你的