环境: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文件删除,重新编译,就可以啦。
希望可以帮助到你。