当Qt数据库应用找不到MySql

来源:互联网 发布:nginx 默认错误页面 编辑:程序博客网 时间:2024/05/22 15:32

以linux环境为例,两种报错情况:
1、载入MySql驱动失败,并在可选数据库驱动中,没有MySql选项
2、载入MySql驱动失败,并在可选数据库驱动中,有MySql选项

针对第一种情况,请检查:
1)mysql数据库已完整安装,可搜索到客户端库文件,如

[luhaitao@localhost ~]$ locate mysqlclient
/usr/lib64/mysql/libmysqlclient.so.18
/usr/lib64/mysql/libmysqlclient.so.18.0.0


2)qt用来使用mysql的插件库已正确安装,这个如果是从官网下载的完整安装包,一般会安装好,如qt-opensource-linux-x64-5.6.1-1.run安装完,在如下类似路径可看到so库

[luhaitao@localhost ~]$ ls /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/
libqsqlite.so  libqsqlmysql.so  libqsqlpsql.so

3)如果是链接时报错,请检查工程设置,在这不详细说明

针对第二种情况,比较奇怪,一般摸不着头脑,我自己的环境出现了这样的问题,查找到最后,原因如下,以做参考:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

1)数据库操作,大部分框架都支持ODBC封装,以便屏蔽底层差异。qt的插件就是为了屏蔽数据库差异,用来封装各厂商的原始客户端连接组件,以达到对上统一的操作接口。所以,一般一个厂商对应一个插件。

2)如果,插件库和厂商客户端组件都安装了,qt也能检测到,但还是报驱动未载入,那很可能的原因就是加载库文件失败了,具体可用ldd命令查看插件库是否依赖完整,如下

[root@localhost ~]# ldd /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/libqsqlmysql.so                                                                                       
       linux-vdso.so.1 (0x00007fff6ebfb000)                                                                                                                             
       libmysqlclient_r.so.16 => not found                                                                                                                              
       libz.so.1 => /lib64/libz.so.1 (0x00007f465f5fd000)                                                                                                               
       libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f465f3c7000)                                                                                                       
       libnsl.so.1 => /lib64/libnsl.so.1 (0x00007f465f1ae000)                                                                                                           
       libssl.so.10 => /lib64/libssl.so.10 (0x00007f465ef3b000)                                                                                                         
       libcrypto.so.10 => /lib64/libcrypto.so.10 (0x00007f465eadb000)                                                                                                   
       libQt5Sql.so.5 => /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/../../lib/libQt5Sql.so.5 (0x00007f465e897000)
       libQt5Core.so.5 => /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/../../lib/libQt5Core.so.5 (0x00007f465e182000)
       libpthread.so.0 => /lib64/libpthread.so.0 (0x00007f465df64000)
       libstdc++.so.6 => /lib64/libstdc++.so.6 (0x00007f465dbe2000)
       libm.so.6 => /lib64/libm.so.6 (0x00007f465d8df000)
       libgcc_s.so.1 => /lib64/libgcc_s.so.1 (0x00007f465d6c8000)
       libc.so.6 => /lib64/libc.so.6 (0x00007f465d307000)
       libfreebl3.so => /lib64/libfreebl3.so (0x00007f465d103000)
       libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f465ceb5000)
       libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f465cbcd000)
       libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f465c9c8000)
       libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f465c796000)
       libdl.so.2 => /lib64/libdl.so.2 (0x00007f465c592000)
       libicui18n.so.56 => /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/../../lib/libicui18n.so.56 (0x00007f465c0f7000)
       libicuuc.so.56 => /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/../../lib/libicuuc.so.56 (0x00007f465bd3f000)
       libicudata.so.56 => /opt/Qt5.6.1/5.6/gcc_64/plugins/sqldrivers/../../lib/libicudata.so.56 (0x00007f465a35c000)
       libgthread-2.0.so.0 => /lib64/libgthread-2.0.so.0 (0x00007f465a159000)
       librt.so.1 => /lib64/librt.so.1 (0x00007f4659f51000)
       libglib-2.0.so.0 => /lib64/libglib-2.0.so.0 (0x00007f4659c18000)
       /lib64/ld-linux-x86-64.so.2 (0x000055bed186b000)
       libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f4659a08000)
       libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f4659804000)
       libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f46595e9000)
       libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f46593c5000)
       libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f4659152000)

从上可以看出,库libmysqlclient_r.so.16找不到,这个库是什么库呢,其实就是mysql客户端组件,我们已经安装了,但是因为版本不一致,而qt又使用的带版本号的版本编译的,导致链接失败。
这种情况,我们可以新建一个适配qt的软链接,使其能找到mysql客户端组件,如下

[root@localhost ~]# ls -lh /usr/lib64/libmysqlclient_r.so.16
lrwxrwxrwx. 1 root root 41 9月  18 23:57 /usr/lib64/libmysqlclient_r.so.16 -> /usr/lib64/mysql/libmysqlclient.so.18.0.0
[root@localhost ~]#

这个时候,再启动应用,数据库驱动就OK了


0 0