在用qt做图形界面开发,连接数据库,显示出错:QSqlDatabase: QMYSQL driver not loaded
查找一些资料发现都是说没有安装libqsqlmysql.so,使用命令locate libsqlmysql.so发现
/home/×××/Qt5.3.2/5.3/gcc/plugins/sqldrivers/libqsqlmysql.so
/home/×××/Qt5.3.2/Tools/QtCreator/bin/plugins/sqldrivers/libqsqlmysql.so
说明已经安装,但是还是编译出现上述错误。
进入到/home/×××/Qt5.3.2/5.3/gcc/plugins/sqldrivers/执行:
ldd libqsqlmysql.so(ldd用来打印程序或者库文件所依赖的共享库列表)
显示:
ldd命令用于打印程序或者库文件所依赖的共享库列表Linux命令大全:http://man.linuxde.net/ldd
ldd命令用于打印程序或者库文件所依赖的共享库列表Linux命令大全:http://man.linuxde.net/ldd
linux-gate.so.1 => (0xb77d7000)
libmysqlclient_r.so.16 => not found
libQt5Sql.so.5 => /home/**/Qt5.3.2/5.3/gcc/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0xb776a000)
libQt5Core.so.5 => /home/**/Qt5.3.2/5.3/gcc/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0xb722e000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb7145000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6f96000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6f7a000)
libicui18n.so.52 => /home/**/Qt5.3.2/5.3/gcc/plugins/sqldrivers/./../../lib/libicui18n.so.52 (0xb6d50000)
........
第二行有错误显示not found。
解决方法一:
搜索libmysqlclient_r.so有个/usr/lib/i386-linux-gnu/下有个libmysqlclient.so.18,将其改成libmysqlclient_r.so.16,重新执行ldd命令,这时显示正确。
解决方法二:
建立16到18的一个软链接。
解决方法三:
上面的方法是治标不治本的。之所以找不到.so.16是因为在安装qt5.3时把.so.16 给更新成18了。需要重新编译生成libsqlmysql.so,使其依赖于libmysqlclient_r.so.18。
(1)
下载最新的qt源码包(该包命名为qt-everywhere-opensource-src-version.tar.gz)
(2)
解压,然后进入qtbase/src/plugins/sqldrivers/mysql/目录
(3)
执行qmake
(4)
执行make
(5)
在qtbase/plugins/sqldrivers/ 目录下会生成正确的libsqlmysql.so,将其拷贝到/home/××/Qt5.3.2/5.3/gcc/plugins/sqldrivers
重新执行下ldd libsqlmysql.so,
linux-gate.so.1 => (0xb76fa000)
libmysqlclient.so.18 => /usr/lib/i386-linux-gnu/libmysqlclient.so.18 (0xb73a9000)
libQt5Sql.so.5 => /home/mahuixin/Qt5.3.2/5.3/gcc/lib/libQt5Sql.so.5 (0xb7368000)
libQt5Core.so.5 => /home/mahuixin/Qt5.3.2/5.3/gcc/lib/libQt5Core.so.5 (0xb6e2c000)
libstdc++.so.6 => /usr/lib/i386-linux-gnu/libstdc++.so.6 (0xb6d43000)
libc.so.6 => /lib/i386-linux-gnu/libc.so.6 (0xb6b94000)
libz.so.1 => /lib/i386-linux-gnu/libz.so.1 (0xb6b7a000)
libdl.so.2 => /lib/i386-linux-gnu/libdl.so.2 (0xb6b75000)
libpthread.so.0 => /lib/i386-linux-gnu/libpthread.so.0 (0xb6b58000)
libm.so.6 => /lib/i386-linux-gnu/libm.so.6 (0xb6b12000)
libgcc_s.so.1 => /lib/i386-linux-gnu/libgcc_s.so.1 (0xb6af5000)
libicui18n.so.52 => /home/mahuixin/Qt5.3.2/5.3/gcc/lib/libicui18n.so.52 (0xb68cb000)
如果还有错误:
QSqlDatabase: an instance of QCoreApplication is required for loading driver plugins
是因为Qt不知道plugins的所在目录。
解决方法:
在用到数据库之前添加代码QCoreApplication::addLibraryPath("path");
其中的"path"可以替换为实际plugins所在的目录(plugins下级存在sqldrivers目录,该目录下的so为QSqlDatabase实际需要的library。