mysql 源碼編譯

1.qt5.12.3安裝

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

image
image.gif

?

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

image
image.gif

?

2.Mysql5.7.27環(huán)境安裝

Mysql5.7.27可以在官網(wǎng)下載msi程序,msi程序的首次安裝會沒有路徑選擇這一項,默認的安裝路徑為

C:\Program Files (x86)\MySQL\MySQL Server 5.7
image.gif

安裝的項目如下:

image
image.gif

?

數(shù)據(jù)文件的安裝路徑為:

C:\ProgramData\MySQL\MySQL Server 5.7
image.gif

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

image
image.gif

?

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

image
image.gif

?

注:mysql的msi安裝完成后,由于路徑中會有空格,可能在qt編譯的時候找不見libmysql.lib,因此在編譯源碼時將mysql安裝目錄下的include文件夾和lib文件夾拷貝到工程目錄下進行編譯,后面會介紹****。

3.mysql源碼編譯

qt5.12.3安裝時可能自帶了mysql的源碼,但是我未能編譯成功,因此專門下載了一份qt5.12.3的源碼進行編譯,因為只編譯mysql的源碼,沒有必要下載全部,因此只下載了qtbase這份源碼,下載如下:

image
image.gif

?

下載完成后解壓至某個目錄,注意目錄不要用空格和中文字符,解壓后的目錄如下:

D:\TestCode\qtbase-everywhere-src-5.12.3
image.gif

mysql的源碼所在目錄如下:

D:\TestCode\qtbase-everywhere-src-5.12.3\qtbase-everywhere-src-5.12.3\src\plugins\sqldrivers\mysql
image.gif

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

image
image.gif

?

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

image
image.gif

?

首先打開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/
image.gif

進行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

image.gif

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

image
image.gif

?

,就按照我的mysql.pro的配置,不要直接使用$$PWD或者直接引用mysql安裝目錄下的include和lib,將這兩個目錄拷貝到工程目錄下使用絕對路徑引用,上面有介紹)

進行重新構建出現(xiàn)如下錯誤:

image
image.gif

?

因此在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")

image.gif

截圖如下:

image
image.gif

?

再次編譯后沒有報錯,在目錄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/),如下

image
image.gif

?

我們需要使用紅框標注的是個文件,將其拷貝至

D:\soft\Qt5123\5.13.0\msvc2017\plugins\sqldrivers
image.gif

,如下

image
image.gif

?

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

image
image.gif

?

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;
}

image.gif

運行后的結果如下

image
image.gif

?

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

image
image.gif

?

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

image
image.gif

?

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容