在Qt中首次使用Mysql数据库时,是否还记得自己曾踩过的坑?当我们满怀期待的根据官方的例子,写出了满意的程序,结果运行时告诉你:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
明明就有驱动嘛,为什么还不能加载呢?这个问题现在上网一搜就一大堆的回答,我们可以知道这么几件事:
(1)Qt中Mysql数据库的操作需要两个库:qsqlmysql.dll(qsqlmysqld.dll),libmysql.dll。前者为Qt官方提供的数据库驱动,后者为MySql提供的C++的数据库连接驱动库。
(2)要想连接操作数据库,这两个库必须加载成功,需要满足的条件是:需要位数相同,版本对应。
MinGW_32bit版本编译出的动态链接库是32位的,因此对应因该使用32位的库。所谓版本对应就是指所采用的Qt驱动库应当是所选用的mysql驱动库版本编译出来的。这就是Qt5版本(5.10.0\mingw53_32\plugins\sqldrivers目录下)为我们提供了驱动程序却常常无法使用的原因,即使我们将自己安装的Mysql客户端bin目录中libmysql.dll拷入了Qt的bin目录,或者将之加入了环境变量.
(3)因此,你成功的前提是:要么别人为你提供了两个对应版本的驱动库,要么你自己去编译一个Qt的驱动库吧
于是,当时的我选择了去Mysql的官网碰碰运气,说不定就下载到了一个与官方给出的驱动库相匹配的库呢?我怀着忐忑的心情下载了一个版本:mysql-connector-c-6.1.10-win32,(https://downloads.mysql.com/archives/c-c/),将libmysql.dll库拷贝到了Qt mingw版本的bin目录。令人振奋的是居然可以,那一刻的我感到自己是多么的幸运,如果没有后来的事,我可能会一致这么觉得。
后来做项目,程序需要发布出来,但是当我将项目发布出来,在自己的开发机上完美运行,部署到其他计算机时,竟然无法连接数据库!!我查看了一下打印的日志,又出现了那个最初的梦魇:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7
显然这个不知道怎么就可以使用的动态库是不可靠的,重新换了一下libmysql.dll还是不行,我甚至怀疑在某个不为人知的地方,存在着一个无比契合的链接库,于是坚韧不拔的我又检查了一遍环境变量的Path目录,毫无收获。折腾了半天,不得不放弃了那个“拿过来就能用的幼稚想法”,重新将源码编译了一下。其实现在IDE很善良,直接在Qt Creator里编译源码是没有任何问题的,(甚至你可能需要不走寻常路的编译操作,还可以自定义编译步骤),(我也搞不懂自己是怎么想的,可能就是想偷下懒)。简单说下怎么编译的吧,这方面的教程一搜索一大堆。
1、准备Qt mysql驱动源码,以及mysql官方驱动动态连接库
mysql动态连接库,可以去mysql官网下载C++驱动,32位的也可以在这里下载https://download.csdn.net/download/CSDN_DTEO/11991256
Qt源码如果你在安装的时候就装了,那就可以直接干事情了。如果没有,可以去官方网站下载,也可以用工具自己更新一下。
2、打开工程,修改工程文件,引入mysql动态链接库目录
打开D:\Qt\Qt5.10.0\5.10.0\Src\qtbase\src\plugins\sqldrivers\mysql\mysql.pro工程项目,这个工程就是mysql驱动的源码了,(D:\Qt\Qt5.10.0是我自己的安装目录)。特别注意的是,直接打开就行了,不要想着单独把这个工程复制出来再打开,那样打开后会发现找不到源码,你得自己添加。直接打开会发现构建的时候就出现了错误,不要慌,没关系,无非就是找不到文件嘛,所以你需要根据提示修改一下工程文件,比如什么Can not read qtsqldrivers-config.pri ,对应qsqldriverbase.pri文件中的设置是:
include($$shadowed($$PWD)/qtsqldrivers-config.pri)
我就到目录下找了一下,根本就没有这个文件,但是看意思无非就需要一个这样的配置文件,在它的上一级目录就可以找到configure.pri,将这个路径添加上或者说将原来的修改了:
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(D:/Qt/Qt5.10.0/5.10.0/Src/qtbase/src/plugins/sqldrivers/configure.pri)
实际上,稍微看一下这个目录结构,看一下工程文件里的配置,就会发现这三个文件的依赖关系从上至下为:mysql.pro->qsqldriverbase.pri->configure.pri
mysql:
qsqldriverbase.pri
当然,除此之外,当然还需要添加官方mysql动态连接库位置,在mysql.pro中添加(填写自己的位置):
win32: LIBS += -LE:/package/mysql-connector-c-6.1.10-win32/lib/ -llibmysql
INCLUDEPATH += E:/package/mysql-connector-c-6.1.10-win32/include
DEPENDPATH += E:/package/mysql-connector-c-6.1.10-win32/include
修改后的文件如下:
mysql.pro
qsqldriverbase.pri
3、修改好后,直接编译,编译成功后,可以在Qt安装目录所在的磁盘根目录找到一个plugins的文件夹,将该目录下的动态链接库拷贝到D:\Qt\Qt5.10.0\5.10.0\mingw53_32\plugins\sqldrivers ,替换原来的(如果不放心,备份一下原来的)
同时,将mysql官方驱动libmysql.dll拷贝到D:\Qt\Qt5.10.0\5.10.0\mingw53_32\bin
如果你实在太懒了,不想自己去编译,可以下载我编译好的,下载地址: