笔者最近在Qt客户端做 tcp + 数据入库(MySQL)的小实验, 就是把tcp接到的数据入库,debug和release下都能正常接收数据和入库。
然而,使用windeployqt工具部署发布.exe后,却只能接收数据而不能入库。
ABSURD!!
既然在Qt客户端debug和release都能正常运行,那么问题必须出在 dll 文件上。
1.首先观察是否缺dll文件,经过观察缺了MySQL的驱动程序,也就是libmysql.dll。
libmysql.dll是什么?
这个文件是链接MySQL数据库必要的驱动程序,是MySQL的第三方库,缺了这个文件程序不会打不开,可以运行,但是不能使用MySql数据库。
将这个文件补上以后,运行,依然不入库;在程序运行过程中试着删除libmysql.dll,删除成功,意味着libmysql.dll根本没有被程序使用到,怪不得不能入库。
WTF?
看来只能使用DLL覆盖大法了。
把C:\Qt\Qt5.9.5\5.9.5\msvc2015_64\bin下所有dll文件复制到.exe所在文件,
替换掉所有重名dll
再次运行.exe,可以正常入库!
140个.dll放在这里显然是不合理的,由于在程序运行过程中,被调用的dll是删不掉的,反之没有被调用的dll可以被删掉,所以Ctrl + a,Delete!
点击取消,这样所有程序能用得到的dll就都留下了!!
可以看到,最后文件夹里只剩下6个dll和1个exe,有这些就足够了。但是奇怪的是,使用Qt windeployqt 生成的文件夹里(算上手动添加的libmysql.dll)也包含这些文件,但就是不能入库,并且libmysql.dll没有被调用。
这就是我想说的问题所在!
有两种可能性,
1.由于libmysql.dll是手动添加的,没有经过windeployqt 的部署,所以不认他。这种可能性比较大。
2.windeployqt复制了无效的dll文件,但是感觉不太可能,因为我对比了每个文件的大小都是对的上的。
Anyway,以后遇到windeployqt以后程序达不到预期功能的情况,那就
1.想想自己调用了哪些第三方库,然后把这些库拷贝过来,运行;
2.依然不能达到预期功能,试着删除这些第三方库,如果可以在程序运行时删除的话说明这些库没有被调用。
3.dll覆盖大法!