简 述: 哇卡卡卡,这次又抓到了 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],只是前两次都没有这么明显和直接。


系列

QtExamples

欢迎 star ⭐ 和 fork 🍴 这个系列的 C++ / QT / DTK 学习,附学习由浅入深的目录,这里你可以学到如何亲自编写这类软件的经验,这是一系列完整的教程,并且永久免费!”



[1] 注释,指代: