1
基本原理
Qt 中有一个典型的 MySql 驱动问题,不出意外的话,只要使用 MySql 数据库,就一定会遇到:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QODBC QODBC3 QPSQL QPSQL7
基本原理:Qt 在操作 MySql 时,会尝试加载对应的插件(即:qsqlmysql.dll 和 qsqlmysqld.dll),但由于这些插件依赖于 MySql 的库(即:libmysql.dll),所以当找不到插件或者对应的 MySql 库时,就会加载失败!
为了测试 MySql 数据库连接,我们提供了一个简单的示例程序(配置按需更改):
#include <QCoreApplication>
#include <QSqlDatabase>
#include <QtDebug>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("192.168.***.***");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("password");
db.setPort(3306);
if (db.open()) {
qDebug() << "Open successfully.";
db.close();
} else {
qDebug() << "Open failed.";
}
return a.exec();
}
下面我们来详细讲解一下,究竟该如何解决上述的 MySql 驱动加载问题?
2
查找 MySql 驱动
在 5.12 及之前的版本中,Qt 的安装包中自带 MySql 驱动,在 plugins/sqldrivers 目录下可以找到:
但到了 5.13 之后,MySql 驱动便没有了,这时我们可以选择手动编译。
3
编译 MySql 驱动
要编译 MySql 驱动,有两个前提条件:
在安装 Qt 时,要一并安装源码(勾选“Sources”组件)。
需要下载 MySql,编译源码时需要用到。
假设 Qt 源码已经安装了,现在进入 MySql 下载页面(见:https://dev.mysql.com/downloads/mysql/),选择合适的版本进行下载:
这里我下载的是最新版本(目前为止是 8.0.19),如果要下载其他的版本,可以选择“Archives”。
解压缩下载的安装包,其目录结构如下所示:
这里的“include”和“lib”目录比较重要,它们分别包含了 MySql 的头文件以及相应的库文件,在编译 MySql 驱动时需要用到。
现在进入 Qt 的 MySql 数据库驱动源码目录(例如:C:\SoftWare\Qt\Qt5.12.3\5.12.3\Src\qtbase\src\plugins\sqldrivers\mysql),打开 mysql.pro,并进行如下更改:
然后进行编译,完成之后,在输出目录下就会生成对应的驱动了:
4
查找依赖
MySql 的库(libmysql.dll)有了,驱动(qsqlmysql.dll 和 qsqlmysqld.dll)也有了,将他们拷贝到程序所在目录,就能正常运行啦?哈哈 O(∩_∩)O,可别高兴的太早哦!
理论上确实如此,但对于高版本的 MySql 来说不行,因为 libmysql.dll 还依赖于其他的库。所以如果按照上述做法,还是会出现“QMYSQL driver not loaded”这样的问题!(很多人被里这坑了,怎么都想不明白)
不信的话,用 Dependencies(见:https://github.com/lucasg/Dependencies)查看一下,是不是有很多依赖的库找不到:
了解之后,现在将这些库文件拷贝到程序所在目录,然后运行程序:
Perfect ,非常完美!
·END·
高效程序员
谈天 · 说地 · 侃代码 · 开车
长按识别二维码,解锁更多精彩内容