2016年6月26日 星期日

Qt如果缺了動態函式庫怎麼編? How to bulid plugins in Qt ?

前言:
        原本打算上一篇文章要把灌雙系統寫完的,不過後來因為要灌幾個小時,我就邊睡邊起           來按幾個按鍵,意識完的時候已經灌好了= =

        不過如果有想要完整教學的話,可以在底下留言,我會補上後來的教學


本文:
        最近在使用Qt寫一個UI,功能是先連到指定的資料庫,然後用在刻好的選單,
        慢慢選好你要的選項之後,產生相對應的SQL指令,最後把那個table傳回UI上顯示

        我寫簡單的UI一直都是用Qt,原因是我C++的UI目前也只會用Qt......(QQ)

        #include <QtSql>
        #include <QDebug>
        #include <QApplication>
        #include "mainwindow.h"

        int main(int argc, char *argv[])
        {
            printf("Compiled with Qt Version %s\n", QT_VERSION_STR);

            QApplication a(argc, argv);
            MainWindow w;
            w.show();

            //設定一個database物件,並選用要用的driver
            QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");

            return a.exec();
        }

        我使用的版本是最新的Qt5.7(我很愛用最新版的東西),然後版本就給我帶來了很大的問           題......(待會會解說)

        先簡單說明一下上面的程式碼,真正有意義的就只有兩條

        printf("Compiled with Qt Version %s\n", QT_VERSION_STR);

        這是確認我的Qt編譯版本(待會會說明為什麼用到這條)

        QSqlDatabase database = QSqlDatabase::addDatabase("QODBC");

        因為我要連的是Microsoft的資料庫(MS SQL),所要用的驅動叫做ODBC

        而當然也不是抓了就可以隨便直接用,而是Qt有自己寫好驅動ODBC的動態函式庫

        藉由那個動態函式庫,我們才能正確的驅動ODBC,並產生database物件

        (因為我是菜鳥,上面的解釋只是我在搞東搞西的時候自己覺得應該是這樣的,有錯可以        指正)

       
        然後如果你是跟我一樣,在Ubuntu上安裝Qt5.7的話,執行這個程式應該會出現

        QSqlDatabase: QODBC driver not loaded
        QSqlDatabase: available drivers: QSQLITE QMYSQL QMYSQL3 QPSQL QPSQL7

       
        疑疑,為什麼其他的驅動都有,就是只有我要用的ODBC沒有...

        不過基本上我也沒別條路可以連資料庫了,我只好想辦法裝起來

        http://doc.qt.io/qt-5.7/sql-driver.html#qodbc

        第一件事情當然還是先翻Qt的document,我也沒有完全看懂他到底在講什麼,不過大意           就是預設安裝沒有ODBC的驅動,你得自己解決(乾)

       
        cd $QTDIR/qtbase/src/plugins/sqldrivers/odbc
        qmake "INCLUDEPATH+=/usr/local/unixODBC/include" "LIBS+=-L/usr/local/unixODBC/lib            -lodbc"
        make

        他說首先,你得先有可以用的OBDC驅動裝在你的電腦裡面,然後再生成一個動態函式             庫去使用它

        這裡就不教怎麼裝ODBC了,沒有很難

        不過我在qmake,make時,不知道為何他就是會出現某些標頭檔有出問題,一直編譯不過

        我大概花了一天多在編這個東西,後來還跑到Windows上去試,全部都失敗

        後來我就放棄官網的document了
        (其實你會發現官網的東西很多都很雷,像是上面那個要cd進的路徑跟Qt5.7根本不太一             樣,他也一直沒有更新)

        http://adamcavendish.is-programmer.com/posts/40431.html

        後來我是看到這篇,這個人是要用mySQL的驅動來連資料庫,可是他媽的明明那個.so檔           好好的,卻不能用

        基本上接下來你可以用幾個動作來稿懂,為什麼這些so檔會有問題用不了

        1.在文章裡面有幾個路徑你可以自己去看看,其實for mySQL跟for OBDC的動態函式庫
        你在你的電腦裡面都找的到,可以直接拉近Qt裡面用

        不過會失敗!

        很大一個原因是你可能有更新Qt或是你的驅動,或是你Qt給你的動態函式庫根本就是舊           版的

        這時候要做的事情,文章裡面是叫你去抓相對應你正在使用的Qt版本的原始碼,然後試           試看把那個so檔編出來

        這是可行的!文章裡面的確有成功

        不過我沒有XD,要有些小步驟

        unpack it and go to qtbase/src/plugins/sqldrivers/mysql/ directory
        >> qmake
        >> make

        他的步驟是這樣,這樣就可以找到你的so擋了

        不過有個問題,我在編的時候會失敗!

        為什麼呢,後來是發現

        你用的原始碼版本正確,可是qmake版本也會影響= =

        你可以用 qmake --version來查看你的qmake版本

        嗯嗯 出來是4.xx版,很明顯可能會有問題

        你可以加上一個flag
        qmake -qt=qt5 --version

        結果我顯示是5.5.1版...

        這代表其實你裝Qt的時候,他並不會連command line 的qmake指令也一起更新,我也不知         道我到底怎麼裝到qmake 5.5.1版本的

        但是,至少你用的Qt creator的qmake是5.7版的吧!!!

        (可以用文章一開始程式碼的compile version來確認)

        所以應該可以用這個qmake來編你的so檔

        解法:
                Qt5.7->工具->選項->建製並執行->Qt Versions

                可以看到我使用的編譯器叫做Qt 5.7.0 GCC 64bit

                位置在 /home/bj/Develop/DevelopTools/Qt/5.7/gcc_64/bin/qmake

                接下來也很簡單,你就重新進入原始碼的odbc資料夾,

                /home/bj/Develop/DevelopTools/Qt/5.7/gcc_64/bin/qmake (使用5.7版本的qmake)

                make

                順利的話你應該就可以在source code的另外一個地方找到你要的so擋了

                最後丟進你Qt的安裝目錄的一個地方,就順利完成!!!













       

沒有留言:

張貼留言