- 背景
- 分析
- 解决
- 总结
- 系列
简 述: 哇卡卡卡,这次又抓到了 Microsoft win10 的 ,这次还影响到了我写代码哦。项目使用 Release X86 编译会成功,而切换到 Release X64 编译会失败。
Error (active) E0147 declaration is incompatible with “BOOLEAN _BitScanForward” (declared at line 2825 of “C:Program Files (x86)Windows Kits10Include10.0.19041.0umwinnt.h”) C:Program Files (x86)Microsoft Visual Studio2019CommunityVCToolsMSVC14.29.30133includeintrin0.inl.h 123
…
Error C2007 #define syntax C:Program Files (x86)Windows Kits10Include10.0.19041.0sharedminwindef.h 38
Error C2144 syntax error: ‘int’ should be preceded by ‘;’ C:Program Files (x86)Windows Kits10Include10.0.19041.0sharedminwindef.h 43
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int C:Program Files (x86)Windows Kits10Include10.0.19041.0sharedminwindef.h 43
本文初发于 “偕臧的小站”,同步转载于此。
背景
对于商业项目,素来用 Release X86 模式编译,需要调试就关闭优化,整个解决方案都是可以编译通过的。但这次需要编译一个 x64 的 dll,来调试;在本机 VS 2019 直接切换为 Release X64 ,报错如下!!! win10 21H2 Qt 5.12.11 Visual Studio 2019
JKS 上明明是有提供的 X64 的 dll,代码即使一行不改,你还报错这么多?你是认真的麽!!! 大声哔哔。
分析
看错都是从头的第一个开始看、开始解,但这次这个错看的很颓然!!!
于是开始 从最底部的错开始看(没错,你是重点)
- 什么错来着,语法错误???
- 还是微软的 minwindef.h 的问题????你确定不是我们的问题??? (你相信自己代码写错的,还是相信 Microsoft 的代码写错了???)怀疑人生中
常见的基本设置都检查一遍后,(包含的头文件路径、库文件链接、C++ 17 及以上、Unicode 编码、优化关闭、多核编译开启),还是一直报这个错。问了一圈,大家都没有编译过 x64 的。
。。。蛋疼中。。。
。。。继续蛋疼中。。。
。。。持续蛋疼中。。。
难道真的是 Microsoft 的错???,思来想去,再看看此文件,再结合 Compiler Error C2007 ,目光又投投向了 minwindef.h 文件。
好吧?此刻我觉得里的文件的概率为 30%,但认为可能是你的错却是 10% 的概率;去控制中心找到 Microsoft Visual Stdio Installer 单独升级了一下 sdk (选择了一个最新的 win10,非 win11);然后重新编译一下,一把过,显示成功了。臘♂️,狂喜
解决
最后的解决方案是将 SDK 由 10.0.19041.0 提升到了 10.0.20348.0。呵~
事后,bc 比较下两个文件,实锤了,且错的很明显和粗糙,这下不是猜测了,晚上可以睡个安心觉了。终究还是 Microsoft 提供的库有错。
总结
最大的收获,是本次心路历程,觉得不可一世的 Microsoft SDK 不可能出错,只可能是我们的代码写的有问题。但这次破除了心里的这种“封建迷信”,亲身体验过,才知道没有什么不可能,这种感觉很奇妙。广泛点说这也算是第三次遇到微软的错误了吧[1],只是前两次都没有这么明显和直接。
系列
QtExamples
欢迎 star ⭐ 和 fork 这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录。
[1] 注释,指代:
- 第一次 win10的20H2使用VS2019,拖曳窗口会崩溃;
- 第二次 一个微软自带的 notepad 所导致的问题



