天天看點

Qt5.14.2 MySQL driver not load

環境: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檔案删除,重新編譯,就可以啦。

希望可以幫助到你。

繼續閱讀