Ubuntu20.04+QT5.13配置mysql过程问题及解决方法记录跳坑

一、问题

由于项目需要故用qt配置mysql ,但是加载数据库时报错,具体报错内容如下:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE

二、解决问题

1、情况1(已有驱动,但依赖库不匹配或缺失)

/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
 

2、情况2(有驱动,但依赖项路径错误)

出现这种情况主要是系统中存在多个版本的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<sqlDriver.size();++i){
        qDebug() << sqlDriver[i] << endl;
    }
console 输出:

"QSQLITE" 

"QMYSQL" 

"QMYSQL3" 

"QODBC" 

"QODBC3" 

"QPSQL" 

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值