環境:ubuntu20.04 64位,Qt5.14.2,MYSQL8.0.22
本人新手,第一次使用qt連接配接mysql就報錯,解決後覺得很有價值,整理一下解決過程,希望能夠幫助到其他人。
這個問題真的很惡心,網上找了很多解決方案,不得不說,網上的教程要湊一起看才有用。
解決方法
首先看看自己Qt目錄下xxx/Qt5.14.2/5.14.2/gcc_64/plugins/sqldrivers裡面有沒有一個叫libsqlmysql.so的庫(這一步沒必要,連不上的八成沒有)
然後需要去下載下傳MySQL壓縮包,也可以安裝,我選擇下載下傳壓縮包,版本與伺服器上資料庫版本一緻(重要!!!),解壓縮之後進入目錄,裡面有個lib,lib裡有幾個libmysqlclient.so.*的檔案,主角就是它們或者其中一個。把這些庫複制到/usr/lib/x86_64-linux-gnu中
sudo cp libmysqlclient.so.* /usr/lib/x86_64-linux-gnu
為什麼複制到這裡呢,等會就明白了
然後進入一個很深的檔案夾–Qt中mysql源檔案夾
先進入sqldriver檔案夾
cd xxx/Qt5.14.2/5.14.2/Src/qtbase/src/plugins/sqldrivers
修改qsqldriverbase.pri
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri) //注釋掉
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
然後進入mysql檔案夾
cd mysql
首先編輯mysql.pro
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)
//以下為新添加内容
//INCLUDEPATH添加剛才下載下傳的MySQL裡面的include路徑
INCLUDEPATH+=/home/yzk/Downloads/mysql-8.0.22-linux-glibc2.12-x86_64/include/
//LIBS添加剛才下載下傳的MySQL裡面的lib裡面的.so檔案(我也不知道該用哪個,就随便加了一個)
LIBS+=/home/yzk/Downloads/mysql-8.0.22-linux-glibc2.12-x86_64/lib/libmysqlclient.so.21.1.22
//這是make之後檔案生成目錄,我直接放在自己的家目錄下,友善找,也可以直接定向到xxx/Qt5.14.2/5.14.2/gcc_64/plugins/sqldrivers
DESTDIR=/home/yzk/
修改好之後執行qmake,這裡要注意,首先看看自己的全局變量qmake是什麼版本的
qmake -v
在這裡就有個坑,如果和Qt版本不一樣的話就會報錯,有一些應用可能會修改qmake路徑,比如anaconda。
建議帶路經選擇qmake進行編譯,保證不會錯。
/xxx/Qt5.14.2/5.14.2/gcc_64/bin/qmake
生成makefile之後,執行make。如果之前make過,記得先把DESTDIR下的之前make出來的檔案删掉再make。
将生成的.so檔案複制到第一步的xxx/Qt5.14.2/5.14.2/gcc_64/plugins/sqldrivers中,然後使用ldd檢視它的依賴
$ ldd libqsqlmysql.so
#以上省略
libmysqlclient.so.21 => not found
libQt5Sql.so.5 => /lib/x86_64-linux-gnu/libQt5Sql.so.5 (0x00007f124e2bf000)
libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f124ddc4000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f124dda3000)
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f124dc1f000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f124da9c000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f124da80000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f124d8bf000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f124d8ba000)
libcrypto.so.1.1 => /lib/x86_64-linux-gnu/libcrypto.so.1.1 (0x00007f124d5a3000)
libssl.so.1.1 => /lib/x86_64-linux-gnu/libssl.so.1.1 (0x00007f124d50e000)
libresolv.so.2 => /lib/x86_64-linux-gnu/libresolv.so.2 (0x00007f124d4f4000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f124d4e8000)
/lib64/ld-linux-x86-64.so.2 (0x00007f124ec48000)
libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007f124d4cb000)
libicui18n.so.63 => /lib/x86_64-linux-gnu/libicui18n.so.63 (0x00007f124d1fd000)
libicuuc.so.63 => /lib/x86_64-linux-gnu/libicuuc.so.63 (0x00007f124d032000)
libpcre2-16.so.0 => /lib/x86_64-linux-gnu/libpcre2-16.so.0 (0x00007f124cfb7000)
libdouble-conversion.so.1 => /lib/x86_64-linux-gnu/libdouble-conversion.so.1 (0x00007f124cfa0000)
libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007f124ce7f000)
libicudata.so.63 => /lib/x86_64-linux-gnu/libicudata.so.63 (0x00007f124b48f000)
libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007f124b41b000)
将顯示not found的依賴,将缺失的依賴複制到/usr/lib/x86_64-linux-gnu裡,依賴檔案就在你下載下傳的mysql的lib中。
我的是libmysqlclient.so.21沒找到,個人認為應該是之前選擇了libmysqlclient.so.21.1.22庫,但是沒有将它放入依賴檔案夾中導緻找不到,是以應該可以在編譯之前把檔案放入/usr/lib/x86_64-linux-gnu解決問題,但是我沒有嘗試。
檢查依賴沒有not found之後,驅動就算是打上了,回到程式。把你的工程檔案裡的xxx.pro_user檔案删除,重新編譯,就可以啦。
希望可以幫助到你。