MENU

解决Qt5无法连接MySQL数据库的问题

• December 13, 2021 • Read: 2966 • 解决方案

引言

我最近打算开一个新项目,会用到 Qt5 和 MySQL,没想到刚开始就遇到了问题...

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QODBC QODBC3 QPSQL QPSQL7

大体意思就是,这个 QSqlDatabase 里面压根就没有 QMySQL 这个驱动,在我印象中 Qt 肯定是自带了 MySQL 驱动的,搜索了一下知道了原因,在老版本的 Qt 中(5.9 还是 5.12?)在 C:\Qt\Qt5.xx\5.xx\mingwxx_xx\plugins\sqldrivers 这个目录下,有 qsqlmysql.dll 这个文件,我这边当然是没有了...所以 MySQL 肯定连不上了,既然没有那只能自己编译了,不可能去网上找吧,不同版本的文件也不同。

注意:不同版本的 MySQL 里面包含不同的 libmysql.dll,不同的 libmysql.dll 必须和配套的 qsqlmysqld.dll (debug 版)或 qsqlmysql.dll(release 版) 一起才能正常工作!

Qt MySQL 驱动构建(使用 MinGW 编译套件)

准备

编译前,请确认以下几点:

  1. 你的 Qt 安装时是否选择了 Sources。
  2. 你的 Qt 安装时是否选择的 64 位的 MinGW。

image.png

很多人应该没有选择 Sources 这一项,问题不大,在控制面板-> 卸载程序中找到 Qt 右键选择更改,自行添加 Sources 这个选项,具体做法可以借助搜索引擎,不怕麻烦的也可以直接重新按要求安装 Qt。

然后确定一下你的 C:\Qt\Qt5.14.2\5.14.2\mingw73_64\plugins\sqldrivers 文件夹里是否如我描述的那样没有 qsqlmysql.dll 文件,然后再开始下一步。

编译

添加 Qt mingw 64 的环境变量,既然你都接触 Qt 了,环境变量对你来说应该是很熟悉的字眼了,就不说明怎么添加了,分别要添加的路径是:

C:\Qt\5.14.2\mingw73_64\bin\
C:\Qt\Tools\mingw730_64\bin\

将以上路径替换成你自己的 Qt 安装路径即可,一定不要搞错了。

然后准备好你的 Qt 路径和 MySQL 路径,在终端中分别执行以下四行命令:

cd C:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers
qmake -- MYSQL_INCDIR="C:\mysql-5.7.36-winx64\include" MYSQL_LIBDIR="C:\mysql-5.7.36-winx64\lib"
mingw32-make
mingw32-make install

上面的路径依然是我自己的路径,请务必更改为自己的 Qt 和 MySQL 路径!

执行完第二行命令后,正常情况会输出以下内容:

Info: creating stash file C:\Qt\Qt5.14.2\5.14.2\Src\qtbase\src\plugins\sqldrivers\.qmake.stash

Running configuration tests...
Checking for DB2 (IBM)... no
Checking for InterBase... no
Checking for MySQL... yes
Checking for OCI (Oracle)... no
Checking for ODBC... yes
Checking for PostgreSQL... no
Checking for SQLite (version 2)... no
Checking for TDS (Sybase)... no
Done running configuration tests.

Configure summary:

Qt Sql Drivers:
  DB2 (IBM) .............................. no
  InterBase .............................. no
  MySql .................................. yes
  OCI (Oracle) ........................... no
  ODBC ................................... yes
  PostgreSQL ............................. no
  SQLite2 ................................ no
  SQLite ................................. yes
    Using system provided SQLite ......... no
  TDS (Sybase) ........................... no

Qt is now configured for building. Just run 'mingw32-make'.
Once everything is built, you must run 'mingw32-make install'.
Qt will be installed into 'C:\Qt\Qt5.14.2\5.14.2\mingw73_64'.

Prior to reconfiguration, make sure you remove any leftovers from
the previous build.

其中你需要关注你的 Checking for MySQL...后面和 Qt Sql Drivers 中的 MySql 是否都是 yes,如果不是,请检查你的路径和编译前的要求,无误后重新执行命令。

然后进行 make 和 install,中途可能会报一些 Warning,问题不大,只要命令执行完成后,你的 sqldrivers 文件夹中出现了如图所示的 qsqlmysql.dll 就代表编译完成了。

image.png

Qt MySQL 驱动构建(使用 MSVC 编译套件)

准备

与使用 MinGW 编译类似,不同的是在使用 QtCreator 配置这个项目时,需要选择对应版本的 MSVC 编译套件,这里以 Qt5.15.2 为例,首先打开 mysql 驱动的 Qt 工程文件:

C:\Qt\5.15.2\Src\qtbase\src\plugins\sqldrivers\mysql\mysql.pro

image.png

在这里我选择 MSVC2019 64bit (注意与自己的 Qt 版本对应,这里对应 Qt5.15.2),然后配置项目即可。
然后会出现一些 error,此时将 mysql.pro 文件中的部分代码修改为:

TARGET = qsqlmysql

HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp

# QMAKE_USE += mysql  注释此处

#以下路径根据自己的mysql安装路径添加
LIBS += -LC:/mysql-5.7.36-winx64/lib -llibmysql
INCLUDEPATH += C:/mysql-5.7.36-winx64/include
DEPENDPATH += C:/mysql-5.7.36-winx64/include

OTHER_FILES += mysql.json

PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
  • LIBS 指定的本地 mysql 动态库路径和动态库的名字;
  • -L 指定库的路径;
  • -l 指定库的名字,不需要写后缀,对应的文件全名为 libmysql.dll
  • INCLUDEPATHDEPENDPATH 指定的是本地 mysql 的头文件目录。

编译

修改完成后,选择 Release 进行编译,会出现错误:error: Cannot read C:/qtsqldrivers-config.pri: No such file or directory,此时打开项目中 qsqldriverbase.pri文件:

# include($$shadowed($$PWD)/qtsqldrivers-config.pri) 注释此处
include(./configure.pri) # 添加本行

然后重新按上述方法编译即可,编译成功之后,就得到了该项目生成的库文件,库文件的位置在安装 Qt 所在盘符的 plugins 目录中。

  • qsqlmysql.dll Release 版本的动态库
  • qsqlmysqld.dll Debug 版本的动态库

最后

mysql 安装目录中的 libmysql.dll 放入你的 Qt 对应编译套件文件夹的 bin 目录或 exe 文件所在目录,MySQL 数据库即可成功连接,项目最终打包上线时,也别忘了将 libmysql.dll 打包进去。

也可以编辑 qmake 的.pro 文件,在其中把该链接库加进去,但打包时还是需要自行添加 libmysql.dll:

LIBS += "C:\mysql-5.7.36-winx64\lib\libmysql.dll"
# 或添加
LIBS += -LC:\mysql-5.7.36-winx64\lib\ -llibmysql

libmysql.dll 在你的 MySQL 目录下的 lib 文件夹内,不同版本也是不能混用,这里推荐 MySQL5.7。

其次,还需要将刚才我们编译好的驱动qsqlmysql.dllqsqlmysqld.dll复制到以下路径:

C:\Qt\5.15.2\msvc2019_64\plugins\sqldrivers # 根据自己的版本选择对应路径


Henry 2021-12-13 未经授权 禁止转载

版权属于:字节星球/肥柴之家 (转载请联系作者授权)
原文链接:https://www.bytecho.net/archives/qt_mysql.html
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

Last Modified: January 10, 2023
Archives QR Code
QR Code for this page
Tipping QR Code
Leave a Comment

已有 1 条评论
  1. 欧乐安 欧乐安 IP属地:四川     iPhone    Safari

    很详细,可以借鉴