解决qt5.6连接mysql出现QMYSQL driver not loaded的问题
环境说明
系统:CENTOS6.5 bit64
Qt版本:5.6
Mysql:5.6
问题描述
连接数据库的代码块如下:
bool mysqlOperate::ConnectDataBase()
{
if(QSqlDatabase::contains("mysql"))
{
m_db = QSqlDatabase::database("mysql");
}
else
{
m_db = QSqlDatabase::addDatabase("QMYSQL","mysql");
}
m_db.setHostName(m_HostName);
m_db.setDatabaseName(m_DatabaseName);
m_db.setUserName(m_UserName);
m_db.setPassword(m_Password);
if(!m_db.isOpen())
{
if(!m_db.open())
{
qDebug()<<"open database fail:";//<< m_db.lastError();
return false ;
}
}
//qDebug()<<"open database sucess!";
return true ;
}
报错信息如下:
QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3
报错信息的大意是:mysql的驱动没有找到,但是支持的驱动有QSQLITE QMYSQL QMYSQL3
而我已经将libqsqlmysql.so放到usr/lib64/下了
解决过程
查找是否有mysql的库
[root@ViGap home]# find / -name libmysql*
/int/soft/mysql5.6.17/lib/libmysqlclient_r.a
/int/soft/mysql5.6.17/lib/libmysqlclient.so.18.1.0
/int/soft/mysql5.6.17/lib/libmysqld.a
/int/soft/mysql5.6.17/lib/libmysqlclient.a
/int/soft/mysql5.6.17/lib/libmysqlclient.so
/int/soft/mysql5.6.17/lib/libmysqld-debug.a
/int/soft/mysql5.6.17/lib/libmysqlclient.so.18
/int/soft/mysql5.6.17/lib/libmysqlservices.a
/int/soft/mysql5.6.17/lib/libmysqlclient_r.so
/int/soft/mysql5.6.17/lib/libmysqlclient_r.so.18.1.0
/int/soft/mysql5.6.17/lib/libmysqlclient_r.so.18
/int/bin/sqldrivers/libmysqlclient.so
/int/bin/sqldrivers/libmysqlclient_r.so
于是建立软连接
将/int/soft/mysql5.6.17/lib/libmysqlclient.so.18 软连接至/usr/lib64中
仍然不起作用
查询libqsqlmysql.so的依赖库
[root@ViGap home]# ldd /lib64/libqsqlmysql.so
ldd: warning: you do not have execution permission for `/lib64/libqsqlmysql.so'
linux-vdso.so.1 => (0x00007ffcba3f7000)
libQt5Sql.so.5 => /lib64/libQt5Sql.so.5 (0x00007fc249c03000)
libQt5Core.so.5 => /lib64/libQt5Core.so.5 (0x00007fc2493e1000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fc2491c5000)
libmysqlclient.so.20 => not found
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fc248ebe000)
libm.so.6 => /lib64/libm.so.6 (0x00007fc248bbc000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fc2489a6000)
libc.so.6 => /lib64/libc.so.6 (0x00007fc2485d8000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fc2483d4000)
librt.so.1 => /lib64/librt.so.1 (0x00007fc2481cc000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc24a05c000)
可以看出来qt的mysql插件库所依赖的mysql动态库版本是libmysqlclient.so.20,网上查了下,包含libmysqlclient.so.20库的mysql版本是5.7,于是去mysql官网下载对应的rpm本地安装包
我已经下载好,安装包提供给大家
整理好的rpm包链接
下载安装包有2个互相依赖
mysql-community-common-5.7.30-1.el6.x86_64.rpm
mysql-community-libs-5.7.30-1.el6.x86_64.rpm
rpm安装方式就地安装即可
rpm -ivh mysql-community-libs-5.7.30-1.el6.x86_64.rpm mysql-community-common-5.7.30-1.el6.x86_64.rpm
安装完成后,再次执行ldd命令可以看到
[root@ViGap home]# ldd /lib64/libqsqlmysql.so
ldd: warning: you do not have execution permission for `/lib64/libqsqlmysql.so'
linux-vdso.so.1 => (0x00007ffdc0bc1000)
libQt5Sql.so.5 => /lib64/libQt5Sql.so.5 (0x00007fe990b6e000)
libQt5Core.so.5 => /lib64/libQt5Core.so.5 (0x00007fe99034c000)
libpthread.so.0 => /lib64/libpthread.so.0 (0x00007fe990130000)
libmysqlclient.so.20 => /usr/lib64/mysql/libmysqlclient.so.20 (0x00007fe98f91e000)
libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007fe98f617000)
libm.so.6 => /lib64/libm.so.6 (0x00007fe98f315000)
libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007fe98f0ff000)
libc.so.6 => /lib64/libc.so.6 (0x00007fe98ed31000)
libdl.so.2 => /lib64/libdl.so.2 (0x00007fe98eb2d000)
librt.so.1 => /lib64/librt.so.1 (0x00007fe98e925000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe990fc7000)
已经能够找到依赖库了
libmysqlclient.so.20 => /usr/lib64/mysql/libmysqlclient.so.20 (0x00007fe98f91e000)
再次运行程序,报错消失。
总结
当再次遇到类似的问题时候,我们需要查看下libqsqlmysql.so 的依赖关系,从而才能知道具体需要哪个版本的mysqlclient库