Windows下编译和使用Qt MySQL插件 (四) 解决加载问题: QMYSQL driver not loaded

这篇是基于已经成功编译并安装了Qt的MySQL插件,如果还没有自己编译插件的,从最下面第一篇的准备工作开始看起

四、解决加载问题: QMYSQL driver not loaded

安装了MySQL插件以后,创建一个数据库连接试试

QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
qDebug() << "isValid:" << db.isValid();

 运行结果:

QSqlDatabase: QMYSQL driver not loaded

QSqlDatabase: available drivers: QSQLITE QMIMER QMARIADB QMYSQL QODBC QPSQL

isValid: false

啊这怎么available drivers里有QMYSQL但是driver not loaded呢?

让我们来看一下插件的调试输出,把环境变量QT_DEBUG_PLUGINS设置为1

如果用Qt Creator可以在项目的运行设置里设置

再次运行,多了很多输出,其中有

"C:/Qt/6.6.0/mingw_64/plugins/sqldrivers/qsqlmysql.dll" cannot load: Cannot load library C:\Qt\6.6.0\mingw_64\plugins\sqldrivers\qsqlmysql.dll: 找不到指定的模块。
QLibraryPrivate::loadPlugin failed on "C:/Qt/6.6.0/mingw_64/plugins/sqldrivers/qsqlmysql.dll" : "Cannot load library C:\\Qt\\6.6.0\\mingw_64\\plugins\\sqldrivers\\qsqlmysql.dll: 找不到指定的模块。"

 “找不到指定的模块”表示在载入qsqlmysql.dll时找不到它依赖的其他dll

那怎么知道依赖哪些dll呢,这边推荐一个工具:Dependencies

它是著名依赖查看工具Dependency Walker(depends.exe)的改良重写版

下载解压后打开DependenciesGui.exe然后把qsqlmysql.dll拖进去

可以看到有些是Qt的bin目录下有的文件,所以我们把bin目录添加到搜索路径

按OK后再看,缺少的已经只剩下libmariadb.dll

现在要做的就是让程序运行时能在PATH包含的路径里找到libmariadb.dll,比较常见的做法是把libmariadb.dll复制到Qt的bin目录,当然也可以像上面修改项目运行设置一样修改PATH的值把MariaDB的lib目录加进去

做完以后我们再次运行程序,这次插件输出里显示

"C:/Qt/6.6.0/mingw_64/plugins/sqldrivers/qsqlmysql.dll" loaded library

isValid: true

说明插件已经能够正常使用了

(别忘了取消设置QT_DEBUG_PLUGINS的环境变量,否则每次都打印一大堆输出也挺烦的)

上面的例子里插件是用MariaDB的libmariadb.dll,如同第一篇一开始所说,它的依赖最少,那如果用的是libmysql.dll呢?比如我们打开用mysql-8.2.0-winx64里的库编译的qsqlmysql.dll

可以看到libmysql.dll的图标颜色不一样,把左边的箭头点开可以看到

原来这个libmysql.dll的依赖还缺少了libcrypto-3-x64.dll和libssl-3-x64,可以在mysql-8.2.0-winx64压缩包的bin目录下找到这两个文件

注意这些依赖文件在打包程序时,要跟Qt的主dll一样,跟项目的exe文件放在同一个目录

如果程序打包后在别的机器上运行时发生无法加载插件的情况,可以在目标机器上也用Dependencies打开libmysql.dll查看是不是缺了什么dll

值得一提的是这里虽然没有显示缺失,但是VCRUNTIME140.dll/VCRUNTIME140_1.dll/MSVCP140.dll/ucrtbase.dll都是MSVC2015+的运行时文件,Windows10系统现在是自带这些文件,但是如果要在更旧的Windows系统运行的话并不能确保肯定有或者可以用(如果你用的是MSVC版本的Qt那原本就需要处理这个问题)

解决办法1是让目标系统都安装VC2015+分发包: Latest supported Visual C++ Redistributable downloads

解决办法2是打包程序时把这些运行时文件也跟其他依赖一样跟exe放在一个目录下

以上两个方法都要注意不要搞混32位文件和64位文件

再看一下其他版本的libmysql.dll依赖:

可以看出它们除了基本Windows API库外都只依赖VC运行时文件,只要处理好这个问题就可以

 其他部分链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值