數據庫連接出現錯誤:缺少mysql驅動

有時候,我們在調試一個代碼的時候,並不是僅僅從一方面搜索資源:
問題出現: 缺少庫
搜索庫名,模塊名
安裝庫: 簡單命令安裝搜索軟件名
QtWebEngineWidgets

  db.open();
    QSqlQuery query;
    query.exec("select * from student2");
    while(query.next())
    {
         QString str= query.value(0).toString();
         int id  = query.value(1).toInt();
         qDebug()<<id<<"|"<<str;

    }

    db.close();

plugins//插件的意思

Qt5.6問題如下:不能加載MySql驅動問題.(需要重新編譯驅動)

QSqlDatabase: QMYSQL driver not loaded

QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

Unable to open database

在解決這個問題的時候,首先在網上查詢了各種解決方案,都嘗試過,但是其中遇到的一些小問題,總是找不到解決方法,最終在”Stack Overflow”上提問得到了答案,故此記錄一下,一遍以後備用,也希望能幫助到一些人.

環境: ubantu16.04 + Qt5.6 + MySql5.

分析

1.首先確定自己是否安好裝了MySql(沒有安裝則先安裝)
安裝方法:(該鏈接裏面同時也包含卸載方法)

http://blog.csdn.net/yimi0903/article/details/11800713

其次執行以下命令,看是否已安裝以下選項:
sudo apt-get install libmysqlclient-dev

  1. 進入驅動所在目錄:

cd /ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers

  1. ls 查看目錄裏面的文件:
    plugins(插件)

cc@1whispers:~/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers$ ls
libqsqlite.so libqsqlmysql.so libqsqlpsql.so

  1. 執行命令查看 libqsqlmysql.so 的依賴:

    ldd libqsqlmysql.so

    linux-vdso.so.1 =>  (0x00007ffcb64e2000)
    libmysqlclient_r.so.16 => not found
    libz.so.1 => /lib/x86_64-linux-gnu/libz.so.1 (0x00007fea06463000)
    libcrypt.so.1 => /lib/x86_64-linux-gnu/libcrypt.so.1 (0x00007fea0622a000)
    libnsl.so.1 => /lib/x86_64-linux-gnu/libnsl.so.1 (0x00007fea06011000)
    libssl.so.10 => /usr/lib/x86_64-linux-gnu/libssl.so.10 (0x00007fea05dba000)
    libQt5Sql.so.5 => /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers/./../../lib/libQt5Sql.so.5 (0x00007fea05b74000)
    libQt5Core.so.5 => /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers/./../../lib/libQt5Core.so.5 (0x00007fea05459000)
    libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007fea0523c000)
    libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007fea04eb9000)
    libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fea04bb0000)
    libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007fea0499a000)
    libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fea045d0000)
    libnss3.so => /usr/lib/x86_64-linux-gnu/libnss3.so (0x00007fea0428a000)
    libnssutil3.so => /usr/lib/x86_64-linux-gnu/libnssutil3.so (0x00007fea0405d000)
    libplc4.so => /usr/lib/x86_64-linux-gnu/libplc4.so (0x00007fea03e57000)
    libnspr4.so => /usr/lib/x86_64-linux-gnu/libnspr4.so (0x00007fea03c18000)
    libicui18n.so.56 => /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers/./../../lib/libicui18n.so.56 (0x00007fea0377d000)
    libicuuc.so.56 => /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers/./../../lib/libicuuc.so.56 (0x00007fea033c5000)
    libicudata.so.56 => /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/plugins/sqldrivers/./../../lib/libicudata.so.56 (0x00007fea019e2000)
    libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fea017dd000)
    libgthread-2.0.so.0 => /usr/lib/x86_64-linux-gnu/libgthread-2.0.so.0 (0x00007fea015db000)
    librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007fea013d3000)
    libglib-2.0.so.0 => /lib/x86_64-linux-gnu/libglib-2.0.so.0 (0x00007fea010c2000)
    /lib64/ld-linux-x86-64.so.2 (0x0000560757219000)
    libplds4.so => /usr/lib/x86_64-linux-gnu/libplds4.so (0x00007fea00ebd000)
    libpcre.so.3 => /lib/x86_64-linux-gnu/libpcre.so.3 (0x00007fea00c4d000)

在此會發現一個問題: libmysqlclient_r.so.16 => not found,說明沒有這個依賴項,所以現在我們要解決的是這個依賴.

5.查看自己所有的 libmysqlclient.so

cc@1whispers:~$ locate libmysqlclient.so

/home/cc/Desktop/libmysqlclient.so.20
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.0

可知到我們的依賴有這些.

編譯MySql驅動

注:通常這種情況最好應該先看看官網文檔
http://doc.qt.io/qt-5/sql-driver.html#qmysql

1.首先要確定自己在安裝Qt的時候安裝了源碼,如果沒有安裝源碼,則需要重裝Qt,切記裝的時候記得選上源碼那一項.

2.進入到源碼中MySql驅動的源碼中

cd /ProgramFiles/Qt5.6.0/5.6/Src/qtbase/src/plugins/sqldrivers/mysql

路徑是各自安裝qt的路徑而來.

  1. 執行編譯:

qmake->make->make install

執行過程:

sudo /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/bin/qmake “INCLUDEPATH+=/usr/include/mysql” “LIBS+=-L/usr/lib/mysql -lmysqlclient_r”
mysql.pro

sudo make

sudo make install

在查看依賴 ldd libqsqlmysql.so ,則會看到已有依賴庫.

再去運行程序,則會顯示成功連接數據庫.

Database connection established

這是記得要sudo make clean清理一下之前編譯的中間文件.

可能出現的問題

1.執行qmake的時候: qmake “INCLUDEPATH+=/usr/include/mysql” “LIBS+=-L/usr/lib/mysql -lmysqlclient_r” mysql.pro這樣的命令是用的默認的qmake文件,這樣如果沒有Qt4的SDK,則會出錯,所以需要用我們自己安裝Qt時路勁下的qmake.

sudo /home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/bin/qmake “INCLUDEPATH+=/usr/include/mysql” “LIBS+=-L/usr/lib/mysql -lmysqlclient_r” mysql.pro

需要加上sudo,不然會出現 not permit的錯誤,即沒有權限,所以需要用root權限.

2.在執行make的時候,也需要用到root權限.不然會出現以下錯誤:

注: 我本人就是死在這裏,因爲沒有用root權限,但是出現錯誤又不懂什麼原因,迷茫了2天,終於解決.

home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/bin/moc -DQT_NO_MTDEV -DQT_NO_LIBUDEV -DQT_NO_TSLIB -DQT_NO_LIBINPUT -DQT_NO_CAST_TO_ASCII -DQT_NO_CAST_FROM_ASCII -DQT_NO_EXCEPTIONS -D_LARGEFILE64_SOURCE -D_LARGEFILE_SOURCE -DQT_NO_DEBUG -DQT_PLUGIN -DQT_SQL_LIB -DQT_CORE_LIB -I/home/cc/ProgramFiles/Qt5.6.0/5.6/Src/qtbase/mkspecs/linux-g++ -I/home/cc/ProgramFiles/Qt5.6.0/5.6/Src/qtbase/src/plugins/sqldrivers/mysql -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtSql/5.6.0 -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtSql/5.6.0/QtSql -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtCore/5.6.0 -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtCore/5.6.0/QtCore -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtSql -I/home/cc/ProgramFiles/Qt5.6.0/5.6/gcc_64/include/QtCore -I/usr/include/c++/5 -I/usr/include/x86_64-linux-gnu/c++/5 -I/usr/include/c++/5/backward -I/usr/lib/gcc/x86_64-linux-gnu/5/include -I/usr/local/include -I/usr/lib/gcc/x86_64-linux-gnu/5/include-fixed -I/usr/include/x86_64-linux-gnu -I/usr/include main.cpp -o .moc/main.moc
moc: Cannot create .moc/main.moc
Makefile:652: recipe for target ‘.moc/main.moc’ failed
make: * [.moc/main.moc] Error 1

  1. 使用證確方式(sudo make)執行後肯能會出現以下問題:
-lQt5Sql -lQt5Core -lpthread  
/usr/bin/ld: cannot find -lmysqlclient_r
collect2: error: ld returned 1 exit status
Makefile:114: recipe for target '../../../../plugins/sqldrivers/libqsqlmysql.so' failed
make: *** [../../../../plugins/sqldrivers/libqsqlmysql.so] Error 1

可知,我們沒有了lmysqlclient_r相關的文件:即沒有libmysqlclient_r.so等文件;但是在之前分析的時候,知道我們有

/home/cc/Desktop/libmysqlclient.so.20
/usr/lib/x86_64-linux-gnu/libmysqlclient.so
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20
/usr/lib/x86_64-linux-gnu/libmysqlclient.so.20.3.0

所以要去鏈接出lmysqlclient_r相關的文件;

cd /usr/lib/x86_64-linux-gnu/
ln -s libmysqlclient.so.20.3.0 libmysqlclient_r.so.20.3.0
ln -s libmysqlclient.so.20 libmysqlclient_r.so.20
ln -s libmysqlclient.so libmysqlclient_r.so

這樣在去執行sudo make命令,則會成功.

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