QMYSQL driver not loaded 原理及解决方案

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·
 

高效程序员

谈天 · 说地 · 侃代码 · 开车

长按识别二维码,解锁更多精彩内容

展开阅读全文
©️2020 CSDN 皮肤主题: 技术黑板 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值