由于项目需要故用qt配置mysql ,但是加载数据库时报错,具体报错内容如下:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE
/opt/Qt5.13.2/5.13.2/gcc_64/plugins/sqldriver
进入QT安装目录下数据库驱动目录,查看驱动文件是否包含libqsqlmysql.so, 如果有该文件则查看文件依赖,使用ldd libqsqlmysql.so进行查询,然后看是否有not found 的,如果有针对该项进行补救,一般是libmysqlclient.so not found ,这里可能是版本没对应或者未安装,具体操作如下。
ldd libqsqlmysql.so //结果为图一
图一
libmysqlclient.so not found等问题可以通过命令实现安装更新,前提是相关依赖项已安装,以下为依赖项安装:
Install dependencies:
libssl-dev (required)
mysql-client
libmysqlclient-dev
libmysql+±dev (check this)
libmysqlcppconn-dev (check this)
sudo apt-get install libssl-dev
sudo apt-get install mysql-client
sudo apt-get install libmysqlclient-dev
sudo apt-get install libmysql+±dev
sudo apt-get install libmysqlcppconn-dev
出现这种情况主要是系统中存在多个版本的QT,且在编译文件前未指定好路径,网上帖子大多不全或者存在一些纰漏。处理该问题的关键主要是确定依赖项的路径,这一步在修改mysql.pro中实现。
报错内容:
Cannot mix incompatible Qt library (version 0x50c08) with this library (version****)
在这种情况编译出来的驱动文件,可能存在依赖项版本混乱的问题,比如在sqlite(可用)是原本就有的,而mysql的是后面才编译复制的,我们可以比较以下两个驱动文件的依赖项和依赖路径,这里直接执行ldd 查询,从看查询结果,两个文件libQt5Sql.so.5依赖库路径存在差异一个是在QT安装路径下, 一个是lib/x86_64-linux-gnu/.. 。从这里可以看出,这两个路径下所支持的版本是不同,/opt下是QT5.13,而/usr下是QT5.12,在QT5.13下出现不兼容,因此需要重新编译libqsqlmysql.so。
ldd libqsqlsqlite.so
linux-vdso.so.1 (0x00007ffffb38e000)
libQt5Sql.so.5 => /opt/Qt5.13.2/5.13.2/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007fdd7a27c000) //XXX
libQt5Core.so.5 => /opt/Qt5.13.2/5.13.2/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007fdd79acc000) //XXX
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fdd79a91000)
ldd libqsqlmysql.so
linux-vdso.so.1 (0x00007fffae3b6000)
libmysqlclient.so.21 => /lib/x86_64-linux-gnu/libmysqlclient.so.21 (0x00007f8a24a9e000)
libQt5Sql.so.5 => /lib/x86_64-linux-gnu/libQt5Sql.so.5 (0x00007f8a24a50000) //XXX
libQt5Core.so.5 => /lib/x86_64-linux-gnu/libQt5Core.so.5 (0x00007f8a24507000)
//XXX
libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f8a24325000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f8a24133000)
普遍做法(建议用下一个方法):
执行下列命令前,需要修改mysql.pro文件,否则会报错,注释掉QMAKE_USE += mysql
#进入到qt的源码目录下的此目录:
$cd ~/Qt/5.13.1/Src/qtbase/src/plugins/sqldrivers/mysql
#使用qmake编译:
$ ~sudo /Qt/5.13.1/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
$sudo make
$sudo make install
至此会生成目标文件libqsqlmysql.so,在/opt/Qt5.13.2/5.13.2/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers 路径下,要把它复制到/opt/Qt5.13.2/5.13.2/gcc-64/plugins/sqldrivers,按照网上帖子所说至此即可用,但本人操作一番后发现无效。于是便有了法二
如若经历了法一,要进行补救,则要先对之前编译生成的文件进行删除,否则在重新make时会出现以下信息:
make: Nothing to be done for 'first'
这里用命令行清除之前make的信息及产生文件,具体操作如下:
$cd ~/Qt/5.13.1/Src/qtbase/src/plugins/sqldrivers/mysql
$sudo make uninstall
$sudo make -f Makefile clean
$cd ~/Qt/5.13.1/Src/qtbase/src/plugins/sqldrivers/mysql
$sudo gedit mysql.pro
然后在文件中增加依赖路径信息,添加下列代码到文件中:
INCLUDEPATH+=/usr/include/mysql
LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient
DEPENDPATH +=/opt/Qt5.13.2/5.13.2/gcc_64/include
完了接着qmake,make,make install 常规操作。
$ ~sudo /Qt/5.13.1/gcc_64/bin/qmake "INCLUDEPATH+=/usr/local/include" "LIBS+=-L/usr/local/lib -lmysqlclient_r" mysql.pro
$sudo make
$sudo make install
结束后试一下是否成功
在QT项目中尝试以下代码,终成功!!!
toolBase = QSqlDatabase::addDatabase("QMYSQL");
QStringList sqlDriver = QSqlDatabase::drivers();
for(int i=0;i
console 输出:
"QSQLITE"
"QMYSQL"
"QMYSQL3"
"QODBC"
"QODBC3"
"QPSQL"