简 述: 哇卡卡卡,这次又抓到了 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 Kits\10\Include\10.0.19041.0\um\winnt.h”) C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\include\intrin0.inl.h 123
…
Error C2007 #define syntax C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\minwindef.h 38
Error C2144 syntax error: ‘int’ should be preceded by ‘;’ C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\minwindef.h 43
Error C4430 missing type specifier - int assumed. Note: C++ does not support default-int C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\shared\minwindef.h 43
[TOC]
本文初发于 “偕臧的小站“,同步转载于此。
背景
对于商业项目,素来用 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],只是前两次都没有这么明显和直接。
系列
欢迎 star
⭐ 和 fork
🍴 这个系列的 C++ / QT / DTK
学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”
[1] 注释,指代: