Qt編譯MySQL驅動

3的4次方發表於2024-04-11

Qt編譯MySQL驅動

參考:qt6.5.0MySQL驅動手動編譯以及資料庫連線詳細教程以及注意事項附資源連結_qt編譯mysql驅動-CSDN部落格

由於MySQL等資料庫的client庫遵循的協議與GPL不相容,因此Qt釋出時不帶有這些驅動,需要自行編譯。

在Qt5版本的編譯由於使用傻瓜式的qmake,要簡單很多:QT出現沒有MySQL驅動,手動編譯步驟 - nanmi - 部落格園 (cnblogs.com)

本文講解Qt6使用cmake編譯的步驟。

下載Qt原始碼

下載Qt對應版本的原始碼,注意Qt安裝時才能安裝對應版本的原始碼,之後再透過QMaintenance Tool就沒有對應版本的原始碼選項了。

但實測拿相近的低版本原始碼應急一下還是可以的。

找到資料庫驅動部分的原始碼

找到資料庫驅動部分的原始碼,為了避免汙染原始碼目錄,可以將這個 sqldrivers 資料夾複製到其他目錄。

注意 sqldrivers 資料夾才是資料庫驅動部分的專案根目錄,不信可以編譯試試,會發現找不到一些Qt自定義的CMake函式。

image

安裝MySQL

安裝MySQL後,在安裝路徑下找到標頭檔案和庫檔案:

image

複製這兩個資料夾到某個路徑不含空格和中文的地方,比如我複製到了 sqldrivers/mysql 下。

配置CMake

這部分我是怎麼知道怎麼配置的?就是看專案中的CMakeLists.txt,很容易看懂。

可以用QtCreator開啟 sqldrivers 工程,配置三個環境變數,可以在 .cmake.conf 中寫(因為這個檔案會被頂層 CMakeLists.txt 引入):

image

然後嘗試編譯,我這裡選的是Release,畢竟誰會去除錯庫:

image

即可在生成目錄得到驅動的庫檔案:

(1)檢視構建目錄位置:

image

image

(2)將生成的庫檔案複製 Qt 外掛目錄:

image

如果用的是 PySide6,則同理需要複製到 PySide6 外掛目錄:

image

(3)將 MySQL client驅動庫檔案複製到 Qt 編譯工具鏈根目錄,這樣以後直接就能用而無需指定庫檔案路徑:

image

測試功能

新建一個 Qt 專案(控制檯專案就行)

CMakeLists.txt 中新增依賴:

find_package(QT NAMES Qt6 Qt5 REQUIRED COMPONENTS Core Sql)
find_package(Qt${QT_VERSION_MAJOR} REQUIRED COMPONENTS Core Sql)

target_link_libraries(mysql_test
    Qt${QT_VERSION_MAJOR}::Core
    Qt${QT_VERSION_MAJOR}::Sql
)

輸入程式碼測試:

#include <QDebug>
#include <QSqlDatabase>
#include <QSqlError>

int main(int argc, char *argv[])
{
    qDebug() << QSqlDatabase::drivers();
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("127.0.0.1");
    db.setDatabaseName("harbor");
    db.setUserName("root");
    db.setPassword("mysql123");
    db.setPort(3306);

    bool ok = db.open();
    if(ok) qInfo() << "OK";
    else qFatal() << "Error: " << db.lastError().text();
}
/*
QList("QSQLITE", "QMIMER", "QMARIADB", "QMYSQL", "QODBC", "QPSQL")
OK
*/

常見錯誤

找不到Qt

如果報錯說找不到Qt,則需要按照提示設定一下變數:

Could not find a package configuration file provided by "QT" with any of the following names: Qt6Config.cmake qt6-config.cmake Qt5Config.cmake qt5-config.cmake Add the installation prefix of "QT" to CMAKE_PREFIX_PATH or set "QT_DIR" to a directory containing one of the above files.  If "QT" provides a separate development package or SDK, be sure it has been installed.

即在頂層 CMakeLists.txt 中設定 Qt 編譯工具鏈路徑:

image

再次嘗試編譯,應該就可以了。

路徑錯誤

觀察編譯輸出資訊,可以看到錯誤原因是路徑不能有空格和中文:

image

但是我們前面已經設定了一個不含空格和中文的路徑啊?

這就要再去看看CMakeLists.txt:

專案頂層 CMakeLists.txt 中要求的是 QT_FEATURE_sql_mysql ,沒寫錯啊:

image

但是檢視 CMakeCache.txt,可以看到問題出在 Qt 編譯工具鏈使用了 MySQL_INCLUDE_PATH ,這個變數是哪來的?

image

檢視 QtCreator 自帶設定的 CMake 變數,可以看到還設定了一個 MySQL_LIBRARY_DEBUG, 使用的路徑是系統中 MySQL 的安裝路徑:

image

之前我不小心將前面設定在 .cmake.conf 中的環境變數設定為 MYSQL_INCLUDE_DIR ,打錯了,導致使用的 QtCreator 設定的環境變數。

修正即可,記得刪除 CMakeCache.txt 再重新編譯。

相關文章