Qt与MySQL连接,drivers not loaded问题


环境 : os : Ubuntu 16.04

             MySql : Ver 14.14 Distrib 5.7.18

             Qt : 5.8

在这个问题上折腾了两天,走了有不少弯路,看了网上不少的解决方法,也有一些收获分享下。

关于Qt连接MySQL出现drivers not loaded 的情形,我遇到的问题中有两类,也导致了我对问题的误判,浪费了时间。

qDebug << QSqlDatabase :: drivers();
QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));
qDebug << db.lastError;

以上三条语句可以基本辅助你完成对出现问题的诊断,当然本文仅限于 drivers not loaded(DNL)问题。

       我们以MySql为例子,首先参照一篇博客:QMySQL driver not loaded的原理和解决办法。这篇文章从Qt连接MySQL的原理过程分析,将问题定在几个链接库的问题上,包括 libmysql.so(在windows下为dll),qsqlmysqld.so,qsqlmysql.so。如果对链接这方面比较熟悉的话,就能明白是在这几个过程中出现了中断、缺失或者版本问题。我们一个个地来查找。

       首先是Qt的sqldriver问题,一个重要的事情是,在Qt的安装过程中,千万不要省事只安装一部分,将最新的Qt版本下的所有组件全部勾选并安装,确认是否全部安装的方法:打开安装路径 Qt5.8/Qt5.8/gcc_64 看是否有一个Src文件夹,如果没有最好选择将Qt卸载并重装。

      如果在编译代码的输出中,看到如下QSqlDatabase : availiable drivers : QSQLITE,xxx 但是没有QMYSQL,那么就可以判断是缺少驱动文件。查看方法,打开 Qt5.8.0/Qt5.8.0/gcc_64/plugins/sqldrivers看是否有libqsqlmysql.so文件,如果没有的话,尝试检查是否需要安装以下lib

sudo apt-get install libqt4-dev
sudo apt-get install libqt4-sql-mysql
sudo apt-get install libqt4-sql
安装完成后,如果可以找到libqsqlmysql.so文件的话,说明驱动安装成功,再次编译你的代码,如果还有问题,考虑是否是MySQL驱动文件的问题,这个时候就需要找MySQL目录下的LIB或者INCLUDE问题。

如果你是默认安装MySQL,在路径 /usr/lib文件加下找到MySQL文件夹,很多共享库(.so)都在这里,如果不在这里的话,退到上级目录,在/usr/lib/x86_64-linux-gnu文件夹中寻找libmysqlclient.so.xxx,如果不存在的话,说明我们需要安装MySQL的库文件

sudo apt-get install libmysql-dev
安装完成后,应该能在这个目录下找到libmysqlclient.so.16(18)等文件。

然后,继续运行我们的代码

如果这时候qDebug出现以下信息:QSqlDatabase : availiable drivers : QSQLITE, QMYSQL, QMYSQL3的样式,恭喜你,第一步的驱动文件问题已经解决了。如果这个时候可以连接上MySQL,那自然是万事大吉。

不过很不幸,我的问题并没有到此结束。

在qDebug出现 QMYSQL作为可用驱动时,仍旧出现了DNL问题,这个时候参照 Stack Overfloe - QMYSQL available but not loaded。

Qt5.8.0/Qt5.8.0/gcc_64/plugins/sqldrivers下查看libqsqlmysql.so的依赖项。

 cd Qt5.8.0/Qt5.8.0/gcc_64/plugins/sqldrivers
 ldd libqsqlmysql.so
会出现该库文件所依赖的一些文件的路径和版本的信息。

着重找一些如下格式的错误:

 libssl.so.10->not found
 libcrypto.so.10->not found
出现这些说明依赖的这些文件缺失,像上面我举的例子就可以首先查找是否在/usr/lib/x86_64-linux-gnu中有libssl.so文件,如果这个也没有,安装库文件

sudo apt-get install libssl-dev
并仍旧在这一个目录下

sudo cp libssl.so libssl.so.10
将libssl.so拷贝一份,并将名字改为.10版本,即可填补not found的空缺。

再次执行代码,应该可以看到数据库的连接成功。



可能用到的路径:

/usr/lib/mysql  /usr/lib/x86_64-linux-gnu   mysql的库文件路径

/Qt5.8.0/Qt5.8.0/gcc_64/plugins/drivers    Qt与MySQL连接驱动库文件路径。

/Qt5.8.0/Qt5.8.0/Src/qtbase/src/sqldrivers   Qt与MySQL连接驱动文件的源代码。












卸载方法:进入安装目录

./MaintenanceTool

你可能感兴趣的:(C++,Qt,MySql,Ubuntu)