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函式。
安裝MySQL
安裝MySQL後,在安裝路徑下找到標頭檔案和庫檔案:
複製這兩個資料夾到某個路徑不含空格和中文的地方,比如我複製到了 sqldrivers/mysql
下。
配置CMake
這部分我是怎麼知道怎麼配置的?就是看專案中的CMakeLists.txt,很容易看懂。
可以用QtCreator開啟 sqldrivers
工程,配置三個環境變數,可以在 .cmake.conf
中寫(因為這個檔案會被頂層 CMakeLists.txt 引入):
然後嘗試編譯,我這裡選的是Release,畢竟誰會去除錯庫:
即可在生成目錄得到驅動的庫檔案:
(1)檢視構建目錄位置:
(2)將生成的庫檔案複製 Qt 外掛目錄:
如果用的是 PySide6,則同理需要複製到 PySide6 外掛目錄:
(3)將 MySQL client驅動庫檔案複製到 Qt 編譯工具鏈根目錄,這樣以後直接就能用而無需指定庫檔案路徑:
測試功能
新建一個 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 編譯工具鏈路徑:
再次嘗試編譯,應該就可以了。
路徑錯誤
觀察編譯輸出資訊,可以看到錯誤原因是路徑不能有空格和中文:
但是我們前面已經設定了一個不含空格和中文的路徑啊?
這就要再去看看CMakeLists.txt:
專案頂層 CMakeLists.txt 中要求的是 QT_FEATURE_sql_mysql
,沒寫錯啊:
但是檢視 CMakeCache.txt,可以看到問題出在 Qt 編譯工具鏈使用了 MySQL_INCLUDE_PATH
,這個變數是哪來的?
檢視 QtCreator 自帶設定的 CMake 變數,可以看到還設定了一個 MySQL_LIBRARY_DEBUG
, 使用的路徑是系統中 MySQL 的安裝路徑:
之前我不小心將前面設定在 .cmake.conf
中的環境變數設定為 MYSQL_INCLUDE_DIR
,打錯了,導致使用的 QtCreator 設定的環境變數。
修正即可,記得刪除 CMakeCache.txt 再重新編譯。