写在前面:
本文内容包括:
(1)分析”QSqlDatabase: QMYSQL driver not loaded”出现的原因
(2)解决“QSqlDatabase: QMYSQL driver not loaded”的方法总结
一、背景
在使用Qt操作MySQL数据库过程中,使用Qt编写好连接MySQL数据库的的代码后,编译调试时报错QSqlDatabase: QMYSQL driver not loaded,意味着Qt应用程序与MySQL数据库连接失败。报错如下图所示:
本工程项目开发环境为:
(1)操作系统:Windows
(2)MySQL版本为:8.0
(3)Qt版本为:5.13
(4)QtCreator版本 为:4.9.1
二、分析”QSqlDatabase: QMYSQL driver not loaded”出现的原因
根据上图的报错提示,查阅官方文档,链接:https://doc.qt.io/qt-5/sql-driver.html#qmysql-for-mysql-4-and-higher,得到相关信息,如下
(1)Qt SQL模块使用驱动程序插件与不同的数据库api进行通信。
(2)支持的数据库如下:
根据报错信息提示可用的drivers是: QSQLITE QODBC QODBC3 QPSQL QPSQL7,其中没有QMYSQL驱动。于是乎定位问题出现的原因是:缺少QMYSQL驱动。
查阅计算机Qt安装路径:D:ProgramFilesQt5.13.0mingw73_32pluginssqldrivers 的sqldrivers插件,如下
发现其中没有与MySQL相关的驱动插件。
三、解决“QSqlDatabase: QMYSQL driver not loaded”的方法总结
原来Qt5.13版本下不包含有驱动MySQL的驱动插件,那么就需要自己编译插件了。编译插件的过程如下:
在编译插件之前需准备两个源码包:
(1)需要一个与MySQL连接的扩展包:mysql-connector-c-6.1.3-win32,资源下载链接为:https://dev.mysql.com/downloads/file/?id=450611
(2)Qt的源码,在安装Qt的时候,可以选择安装资源来确保同时将Qt的源码也安装到自己的电脑上。
两个源码包的资源文件如下图所示:
接下来,开始编译源码,如何编译Qt源码这里不细说了。
(1)使用windows命令行切换到该MySQL驱动工程路径下,使用qmake生成相应的makefile文件。
(2)使用mingw32-make编译该工程。
在编译过程中,出现了如下错误:
提示在qsql_mysql_p.h头文件中找不到mysql.h的头文件。说明mysql.头文件没有引入到该工程中。于是在该工程的.pro文件中添加包含路径和库文件路径,添加后文件如下:
(此处添加了用于MySQL连接的扩展包:mysql-connector-c-6.1.3-win32的头文件和资源路径)
添加完成后,重新使用qmake工具生成makefile文件,然后使用mingw32-make编译该工程文件,编译完成后,可以使用mingw32-make install完成插件的安装,也可以不用,手动复制插件到指定路径即可。编译完成后,将生成如下MySQL的驱动组件:
(路径为D:ProgramFilesQt5.13.0Srcqtbasesrcpluginssqldriverspluginssqldrivers)
(3)将其中的qsqlmysql.dll文件和qsqlmysqld.dll文件复制到 D:ProgramFilesQt5.13.0mingw73_32pluginssqldrivers,注意这里是D:ProgramFilesQt5.13.0mingw73_32文件夹中
(4)进行测试,在QtCreator中编译运行自己写好的MySQL连接程序,又出现报错,如下图:
此时分析报错,QMYSQL驱动已经存在,然而依然不能连接到MySQL数据库。于是将MySQL连接的扩展包:mysql-connector-c-6.1.3-win32中的lib文件夹下的libmysql.dll和libmysql.lib(该ibmysql.lib文件可以不要)文件复制到Qt构建套件路径D:ProgramFilesQt5.13.0mingw73_32in下,如下图:
重新测试,于是乎可以连接到MySQL数据库了。
(四) 总结
总而言之,使用了Qt sql模块来操作MySQL数据库,需要三个库文件来支持,分别为:libmysql.dll、qsqlmysql.dll文件和qsqlmysqld.dll文件,三个文件缺一不可。若在Qt安装路径的插件文件夹路径下(D:ProgramFilesQt5.13.0mingw73_32pluginssqldrivers )找不到对应的驱动扩展,那么就需要编译相应的驱动扩展文件到相应路径。同时要将用于与MySQL连接的扩展包:mysql-connector-c-6.1.3-win32文件下的libmysql.dll库文件复制到Qt构建套件路径D:ProgramFilesQt5.13.0mingw73_32in文件夹中,确保能与MySQL连接成功。
(注:在使用Qt编写数据库连接层代码时,可以使用QSqlDatabase::drivers()方法来查看Qt当前开发环境下有哪些可用的数据库驱动程序)