使用Qt 5.12.12时需要直连Mysql,但是没有提供相应的库文件,这时我们就需要编译Qt中mysql的源码。
编译mysql源码
(1)在Qt安装目录下,找到这个文件夹D:\Qt\Qt5.12.12\5.12.12\Src\qtbase\src\plugins\sqldrivers\mysql。
![](https://img-blog.csdnimg.cn/img_convert/afb116294f6f4b976d757c0187ca77ef.png)
(2)双击打开mysql工程,然后选择适当的编译器,安装mysql时是64或者32位,那编译器就选择64或者32位,MinGW或者MSVC均可。这里我使用MinGW730_64bit进行编译。
![](https://img-blog.csdnimg.cn/img_convert/a6a7749bdec67c51d8e12f736561f6af.png)
(3)修改.pro文件,将QMAKE_USE += mysql注释掉,添加如下图所示的几行代码
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
#这里的路径是MySQL安装路径下的include文件夹哦,记得替换成自己的MySQL安装路径哦
INCLUDEPATH +="C:\Program Files\MySQL\MySQL Server 8.0\include"
#在这里引入静态库,写绝对路径好一点,不容易发生一些莫名其妙的错误(会弄的大佬除外)
#记得替换成自己的路径
LIBS +="C:\Program Files\MySQL\MySQL Server 8.0\lib\libmysql.lib"
#将我们编译好的文件放在这个项目,就是mysql文件夹下的myLib文件夹内
DESTDIR = ../mysql/myLib/
(4)双击打开qsqldriverbase.pri文件,将第四行注释掉,即#include($ s h a d o w e d (shadowed(shadowed( $PWD)/qtsqldrivers-config.pri),然后添加include(./configure.pri),保存。对照修改
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include(./configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
(5)点击构建按钮进行构建,生成4个文件。如下图所示:
![](https://img-blog.csdnimg.cn/img_convert/0f6eb2c3e1402fb7d1a339a5b9114305.png)
(6)将qsqlmysql.dll和qsqlmysqld.dll两个dll文件拷贝到mingw73_64\plugins\sqldrivers中,如下图所示。
![](https://img-blog.csdnimg.cn/img_convert/3abf29eadd65350d7b41e3a684842762.png)
(7)测试代码
.pro文件中加上QT += sql
QT += sql
在要使用的头文件或者源文件中加上#include<QSqlDataBase>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1"); //连接本地主机
db.setPort(3306);
db.setDatabaseName("指定的数据库名称");
db.setUserName("数据库登录名");
db.setPassword("数据库登录密码");
bool ok = db.open();
if (ok){
QMessageBox::information(this, "infor", "link success");
}
else {
QMessageBox::information(this, "infor", "link failed");
qDebug()<<"error open database because"<<db.lastError().text();
}
}
如果测试成功则没问题,如果测试失败,则看(8)。
(8)因为mysql8.0之后有加密,所以要额外添加两个动态库,参考(20条消息) QT有QMYSQL驱动,但是依旧报错“QMYSQL driver not loaded”解决方法_忽而以冬的博客-CSDN博客