这篇是基于已经成功编译并安装了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运行时文件,只要处理好这个问题就可以
其他部分链接: