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的安裝目錄的一個地方,就順利完成!!!













       

2016年6月18日 星期六

從買新電腦到重灌完一條龍教學(1)-先灌windows

前言:
       
        之前有說要灌windows + Ubuntu雙系統,至於為什麼是先灌windows呢

        這邊用我完全沒考證過的經驗來解釋

        基本上你要把電腦開機可以分成幾個階段

        一開始會先進BIOS,你可能從來沒看過,因為通常預設會跳過這個階段
        (BIOS我的理解是寫死在主機板上的基礎程式)

        接下來,因為你的電腦可能有很多個作業系統,你要讓一個作業系統跑起來

        並不是滑鼠右鍵點他就會動了,各種不同的作業系統,在主機板上用的指令,執行方式

        肯定大不相同,所以我們想用哪個作業系統開機前,都要先boot它

        windows的開機驅動叫做windows boot manager

        ubuntu好像沒有特別講叫做啥名字,但是你在選單上選Ubuntu也會經過boot這個動作

body:

        幹,前言講太多了,總之我們先把windows10的映像檔抓下來吧

        學校的windows10檔案名稱叫做Win10_Cht_64Bit.iso,你作業系統要灌來源來自哪裡我管不           著,總共3,8G,要等1小時載完,因為我原本打算按了下載之後就跑去睡覺,

        所以我就順便按了ubuntu-16.04-desktop-amd64.iso(Ubuntu的映像檔)
        Visual_Studio_Pro_2015_Cht_32bit.iso(vs2015)
        Office_2016_Pro_Plus_Cht_64Bit.iso(office2016)
        這些我自己都會用到,反正要睡一覺先存起來等win10裝完,再一起裝

        在等待下載的時間,就來介紹一個概念吧!

        你會注意到,我們下載的檔案,副檔名都是.iso,這到底是什麼檔案類型呢?
        (通常中文都稱作光碟映像檔)

        再解釋之前,大家可以先想想幾個問題

        我們都知道,作業系統基本上是你跑任何軟體的核心,然後也跟你儲存資料有很大的影           響

        所以我們對作業系統最大的要求是什麼?

        沒錯,就是要快,而且要穩!

        你不會希望你copy一個500mb的東西就要等半小時,也不想要整天windows都動不動就變         慢當機

        要如何達到這些點呢,我們的做法是

        再安裝作業系統時,我們找一塊固定,連續的磁碟空間來裝他,這樣你每次要讀系統               時,都只要在固定的地方讀就行了
        (假設你的電腦有A~F磁區,你並不會想要你的windows boot manager50%裝在A磁區,               30%裝在B磁區,20%裝在C磁區吧,這樣實際也許還是跑得起來的,但是速度跟風險都           會很不理想)

        而映像檔格式,就是專門存要放在一整塊連續磁碟空間的軟體,舉例而言就是作業系統

        (一次全部下載完還要五個小時,下一篇再繼續講灌作業系統的概念)
       



















從買新電腦到重灌完一條龍教學(0)-前言

前言的前言:

        最近因為工作需要買了一台三萬的桌機,

        對我這種一直都是用低階筆電的人,這台電腦對我而言的效能根本就是爆表,
       
        正好有機會來從0開始灌一台電腦,就想來寫個教學。

前言:

        在電腦時電腦店會問你要不要作業系統,因為學校有買教育版,所以我就說免了

        本教學的暫定目標為灌完win10 + Ubuntu雙系統,之後有需要可能也會加其他東西