Qt 5.1.0 on Ubuntu Linux, MySQL数据库报错 (driver not loaded)

原文地址:http://adamcavendish.is-programmer.com/posts/40431.html

问题描述:

QSqlDatabase: QMYSQL driver not loaded
QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7
false
引起报错的示例代码如下:

#include 
#include 
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    QSqlDatabase db = QSqlDatabase::addDatabase("QMYSQL");
    db.setHostName("localhost");
    db.setDatabaseName("test");
    db.setUserName("test");
    db.setPassword("xxxxxxxxxx");
    bool ok = db.open();
    qDebug() << ok;
    db.close();
 
    return a.exec();
}

尼玛是什么玩意?

明明mysql就属于已有驱动,为什么还要报这样的错误呢?

好吧,忽略我发牢骚吧。咱们进入正题。

为什么会这样,解释如下:

不管有没有报这错,如果你懂C++,你一定知道库文件的依赖问题最头疼了(好吧,貌似这不仅仅是C++才会遇到的问题)

如果你在ubuntu linux下通过官方安装包进行安装的Qt,那么MySQL插件一定在下面文件夹里。

$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/plugins

(我的相应环境如下:/opt/Qt5.1/5.1.0/gcc_64/plugins/文件夹下)

如果你是通过apt-get安装默认的Qt5包文件,那么插件一定是在下面几个文件夹下:

/usr/lib/i386-linux-gnu/$QT_VERSION/plugins/ for 32bits ubuntu

或者

/usr/lib/x86_64-linux-gnu/$QT_VERSION/plugins/ for 64bits ubuntu

那么怎么检查有没有mysql驱动呢,按着下面步骤就可以了。
打开上述的插件目录,即plugins目录
打开plugins目录下的sqldrivers目录
检查是不是有一个叫libqsqlmysql.so的库文件
如果这个库文件存在,那么你可以在QSqlDatabase的可用驱动找到它。
然而的确是找到却还是要报错,应该会是因为误操作或是mysql更新导致库文件不能使用。
通过下面的代码可以检查库文件的依赖性。
ldd libqsqlmysql.so
在我的环境下会得到以下报错
libmysqlclient_r.so.16 => not found ---- 说明库文件依赖未能正确完成。(至于为什么会这样?应该是在我安装Qt之后,我更新了mysql的安装包)

怎么解决
重新编译那个工程
下载最新的qt源代码(下载文件应该叫“qt-everywhere-opensource-src-version".tar.gz)
解压这个然后进入qtbase/src/plugins/sqldrivers/mysql/ 这个目录下。
注:那些本身从官方安装包安装Qt,在你的安装根目录目录会有个Src的目录,找到qtbase就是你需要的源代码,就不要去下载了。
执行以下命令

>> qmake
>> make
他会在这个目录qtbase/plugins/sqldrivers/下再次生成那个库文件
我们再次检查这个重编译的插件库
>> ldd libqsqlmysql.so
在我的环境下会生成下面信息:
libmysqlclient.so.18 => /usr/lib/x86_64-linux-gnu/libmysqlclient.so.18 (0x00007f98f988d000) 
说明这个库文件依赖性已经解决了。
把这个库文件拷贝到之前所说的那个文件夹下,将之前的替换掉即可。
之前目录如下:
$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/plugins
或者
/usr/lib/i386-linux-gnu/$QT_VERSION/plugins/
或者
/usr/lib/x86_64-linux-gnu/$QT_VERSION/plugins/
如果你还是遇到这个问题,很有可能是你环境没配好,那就重新配一下吧。
export PATH="$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/bin/":$PATH
export LD_LIBRARY_PATH="$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/lib/":$LD_LIBRARY_PATH
export LD_LIBRARY_PATH="$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/plugins/":$LD_LIBRARY_PATH
export LIBRARY_PATH="$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/lib/":$LIBRARY_PATH
export LIBRARY_PATH="$QT_INSTALL_PLACE/$QT_VERSION_NUMBER/$COMPILE_TOOL_KIT_NAME/plugins/":$LIBRARY_PATH
我的环境是这样的:
export PATH="/opt/Qt5.1/5.1.0/gcc_64/bin/":$PATH
export LD_LIBRARY_PATH="/opt/Qt5.1/5.1.0/gcc_64/lib/":$LD_LIBRARY_PATH
export LD_LIBRARY_PATH="/opt/Qt5.1/5.1.0/gcc_64/plugins/":$LD_LIBRARY_PATH
export LIBRARY_PATH="/opt/Qt5.1/5.1.0/gcc_64/lib/":$LIBRARY_PATH
export LIBRARY_PATH="/opt/Qt5.1/5.1.0/gcc_64/plugins/":$LIBRARY_PATH
这说明你把插件目录也放在库路径里面去了。

特别注意一下:

你可能编译不成功,报警如下:

mysql.h头文件不存在,在执行make的过程中,会报这个警。

如果你遇到这样的情况,不要慌张,你只是没有安装libmysqlclient-dev,你只需apt-get它一下就可以了,再次make,就不会有报错了。

你可能感兴趣的:(Qt,Linux)