当发生如下错误:
Cannot mix incompatible Qt library (version 0x40806) with this library (version 0x40805)
首先要知道意义是:
载入dll的时候0x40805加载了0x40806,导致出错。主语是0x40805。换句话说是0x40805必须载入0x40805。
以上0x40805 意义就是 dll的版本是qt4.85, 0x40806亦然.
由于我环境中qt4.8.5已经删除。检查环境变量Path、QTDIR也是指向4.86. 不明白为何我程序中有4.85的dll,而且大行其道,阻碍我加载其他4.86的dll。
没办法,单步调试,发现发生上述错误的地方是以下这一行:
QScriptEngine engine;
所以很容易想到是QtScriptd4.dll有问题(虽然问题可能不是他)。
因为我这里是只可能执行文件当前目录有问题,所以只看的当前目录的qt自带的dll。
用vs工具Visual Studio Command Prompt 执行如下命令
用vs工具Visual Studio Command Prompt 执行如下命令
dumpbin /headers C:/Qt/4.8.6/QtScriptd4.dll | findstr image
4.86 image version
这表明
QtScriptd4.dll没问题,那么谁有问题呢
再次查询
dumpbin /headers QtCored4.dll | findstr image
4.85 image version
原来真正有问题的是QtCored4,因为是QtCored4.dll加载的QtScriptd4.dll,所以报错0x40805加载了0x40806出错。
一切水落石出了,原来虽然我当前用的QT4.86编译的程序,但是dll还是用的4.85的。
最简单的解决办法,拷贝一个4.85的QtScriptd4.dll到执行文件目录即可。
总结:
1)源代码用qt4.86,dll用qt4.85是可以的(与上面没矛盾,这里指的是统一用qt4.8.5的dll。),因为跨度不大,当然有其他问题的时候最好源码代码和dll全部统一。
2)dll的版本号必须全部统一。
3)可用dumpbin /headers QtCored4.dll | findstr image查看QT的dll的版本号(当然右键属性也可以看到)
4)dll加载的顺序是本地目录优先,其次环境变量Path中的目录,只加载第一个先找到的
5)解决办法是先查看自己执行文件同目录的qt自带的dll版本号(假如有的话)。再查看环境变量(如Path,QTDIR)下的qt自带的dll版本号,保证一致。