环境 : 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;
我们以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