1.qt5.12.3安裝
工作需要我安裝了qt5.12.3的mingw32、mingw64、msvc32、msvc64環(huán)境如下:

?
編譯時使用的是msvc2017 32bit環(huán)境(msvc環(huán)境的搭建過程簡略描述為:下載安裝VS2017、下載安裝winsdksetup,下載安裝qt5.12.3),安裝完成后需要配置一下編譯環(huán)境,msvc32位的編譯環(huán)境如下:


?
2.Mysql5.7.27環(huán)境安裝
Mysql5.7.27可以在官網(wǎng)下載msi程序,msi程序的首次安裝會沒有路徑選擇這一項,默認的安裝路徑為
C:\Program Files (x86)\MySQL\MySQL Server 5.7

安裝的項目如下:


?
數(shù)據(jù)文件的安裝路徑為:
C:\ProgramData\MySQL\MySQL Server 5.7

安裝后配置一下環(huán)境變量,以保證include和lib可用


?
環(huán)境變量配置完成后,需要確認一下你安裝的mysql的位數(shù)


?
注:mysql的msi安裝完成后,由于路徑中會有空格,可能在qt編譯的時候找不見libmysql.lib,因此在編譯源碼時將mysql安裝目錄下的include文件夾和lib文件夾拷貝到工程目錄下進行編譯,后面會介紹****。
3.mysql源碼編譯
qt5.12.3安裝時可能自帶了mysql的源碼,但是我未能編譯成功,因此專門下載了一份qt5.12.3的源碼進行編譯,因為只編譯mysql的源碼,沒有必要下載全部,因此只下載了qtbase這份源碼,下載如下:

?
下載完成后解壓至某個目錄,注意目錄不要用空格和中文字符,解壓后的目錄如下:
D:\TestCode\qtbase-everywhere-src-5.12.3

mysql的源碼所在目錄如下:
D:\TestCode\qtbase-everywhere-src-5.12.3\qtbase-everywhere-src-5.12.3\src\plugins\sqldrivers\mysql

將mysql的安裝目錄下的include文件和lib文件拷貝至上述目錄中

?
然后使用QT5.12.3打開mysql源碼文件,如下


?
首先打開mysql.pro文件,注釋掉QMAKE_USE +=mysql ,添加動態(tài)庫依賴,設置輸出:
DESTDIR = ../mysql/libmysql/
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)
win32:CONFIG(release, debug|release): LIBS += -LD:/TestCode/qtbase-everywhere-src-5.12.3/qtbase-everywhere-src-5.12.3/src/plugins/sqldrivers/mysql/lib/ -llibmysql
#else:win32:CONFIG(debug, debug|release): LIBS += -L$$PWD/lib/ -llibmysqld
#else:unix: LIBS += -L$$PWD/lib/ -llibmysql
INCLUDEPATH += D:/TestCode/qtbase-everywhere-src-5.12.3/qtbase-everywhere-src-5.12.3/src/plugins/sqldrivers/mysql/include
DEPENDPATH += D:/TestCode/qtbase-everywhere-src-5.12.3/qtbase-everywhere-src-5.12.3/src/plugins/sqldrivers/mysql/include
DESTDIR = ../mysql/libmysql/

進行make后提示 qtsqldrivers-config.pri no such file or directory,經(jīng)查找確實沒有找到改文件,因此修改qsqldriverbase.pri文件如下:
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
#include($$shadowed($$PWD)/configure.pri)
include(./configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII

因為我可以在源碼目錄中找到configure.pri文件,但是找不到qtsqldrivers-config.pri 文件,懷中試一試的心態(tài)就這樣修改了,修改后執(zhí)行make,(如果在編譯時出錯,提示如下:

?
,就按照我的mysql.pro的配置,不要直接使用$$PWD或者直接引用mysql安裝目錄下的include和lib,將這兩個目錄拷貝到工程目錄下使用絕對路徑引用,上面有介紹)
進行重新構建出現(xiàn)如下錯誤:

?
因此在qsql_mysql_p.h文件中進行了修改,在#include<mysql.h>上方添加了如下內(nèi)容:
#pragma comment(lib, "D:/TestCode/qtbase-everywhere-src-5.12.3/qtbase-everywhere-src-5.12.3/src/plugins/sqldrivers/mysql/lib/libmysql.lib")

截圖如下:


?
再次編譯后沒有報錯,在目錄D:\TestCode\qtbase-everywhere-src-5.12.3\qtbase-everywhere-src-5.12.3\src\plugins\sqldrivers\mysql\libmysql下會有生成的動態(tài)庫文件(mysql.pro文件中有相應的配置輸出目錄DESTDIR = ../mysql/libmysql/),如下

?
我們需要使用紅框標注的是個文件,將其拷貝至
D:\soft\Qt5123\5.13.0\msvc2017\plugins\sqldrivers

,如下

?
將mysql5.7.27中的libmysql.dll拷貝至D:\soft\Qt5123\5.13.0\msvc2017\bin目錄下,如下

?
4.測試
編寫測試程序測試mysql驅動是否可用,在pro文件中添加sql。
測試程序如下:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSqlDatabase>
#include<QSqlError>
#include<QDebug>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
/**
* @brief 測試Mysql數(shù)據(jù)庫
*/
QSqlError err;
QStringList drivers = QSqlDatabase::drivers();
qDebug()<<drivers.join("-");
QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
db.setDatabaseName("mysql");
db.setHostName("127.0.0.1");
db.setPort(3306);
if (!db.open("你的數(shù)據(jù)數(shù)據(jù)庫用戶", "你的數(shù)據(jù)庫密碼")) {
err = db.lastError();
db = QSqlDatabase();
qDebug()<<err.text();
}else{
qDebug()<<"open successful";
}
db.close();
}
MainWindow::~MainWindow()
{
delete ui;
}

運行后的結果如下


?
此時mysql驅動就可以使用了,如果你在配置好環(huán)境出現(xiàn)如下錯誤:


?
請檢查一下的編譯環(huán)境是否正確,可能是如下64位的編譯環(huán)境如下:

?