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 <QCoreApplication>
#include <QtSql>
 
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,就不會有報錯了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章