Qt 專案若同時連結系統安裝的 MySQL C API 庫與 Qt 內建的 SQL 驅動插件,極易發生符號衝突、執行緒安全、記憶體管理不一致等難以除錯的問題。本文記錄實際遇到的 QDir 讀取異常、system() 返回 32512 等詭異現象,以及透過自行編譯 Qt MySQL 驅動解決衝突的過程。
QDir 讀取檔案間歇性失敗 (有時可讀、有時不可讀)system() 執行外部命令間歇性失敗,返回值 32512 (對應 ECHILD 或 Shell 執行失敗)# 1. 取得 Qt 原始碼 (對應版本)
# 2. 進入 Qt SQL 驅動原始碼目錄
cd /src/plugins/sqldrivers/mysql
# 3. 使用目標 MySQL 開發套件編譯
qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/mysql -lmysqlclient" mysql.pro
make
# 或 Windows
qmake "INCLUDEPATH+=C:/MySQL/include" "LIBS+=C:/MySQL/lib/libmysql.lib" mysql.pro
nmake
qsqlmysql.dll (或 libqsqlmysql.so) 複製至專案輸出目錄或 Qt 插件目錄 (plugins/sqldrivers/)libmysqlclient 版本與編譯時一致Qt 整合第三方 C 庫時,編譯器、標準庫、目標庫版本三者必須一致。自行編譯 SQL 驅動插件是解決 MySQL 庫衝突的標準做法,亦適用於 PostgreSQL、ODBC、SQLite 等其他驅動。