2月 07, 2009

【筆記】Installing Qt with MinGW

@
  由於安裝 Qt 感覺起來還滿麻煩的,所以在這裡,我使用 Windows XP + MinGW 的環境,紀錄一下安裝 Qt 的步驟與過程。




  首先,請先到 Qt for Open Source C++ development on Windows 的下載頁中,選擇一個載點下載當前最新版的 "qt-win-opensource-4.4.3-mingw.exe"(請自己選擇當前最新版)。



  下載完成,開始安裝之後,安裝程式會詢問你要不要將 .ui 副檔名跟 Qt 的 GUI 編輯器(Qt Designer)作檔案關聯。

  基本上不用更改直接繼續就可以了。



  接著選擇安裝 Qt 的目錄。



  在這裡,假如你已經安裝過 MinGW,請直接選擇 MinGW 所在的目錄。

  (要瞭解如何安裝 MinGW,請見這篇文章。)



  此時,若你的 MinGW 是新版(我的是 5.1.4 版),Qt 的安裝程式會對 w32api.h 版本不合提出警告。

  但是,因為此時我的 w32api.h 的版本為 3.12,照理說是比 Qt 需求的 3.2 版還要新的。既然我的版本比 Qt 需求的版本還新,安裝程式還對此提出警告,實在是有些怪異。

  無論如何,在此我們先選擇「是」,忽略這個警告繼續進行安裝。




  而若是電腦裡並沒有預先安裝 MinGW,則可以勾選上面的 "Download ans install minimal MinGW installition",再選擇欲安裝 MinGW 的目錄。



  接著它會要你選擇下載 MinGW 的鏡像點(mirror)。

  其實也沒什麼好選的,因為站點只有一個 Norway。

  至於下方的 "Download MinGW source code" 則是可以順便將 MinGW 的原始碼下載下來。沒必要的話就別勾選吧。



  之後就會開始下載 MinGW 的動作(由於鏡像點相當遠,下載可能會等很久)。





  等一段時間,就能安裝完成了。


  不過,這樣還不能夠藉由 C++ 來使用 Qt。我們還需要將 Qt 函式庫進行編譯才能夠使用。

  首先,請到系統內容中,將 MinGW 目錄下的 bin 資料夾與 Qt 目錄下的 bin 資料夾加入到 PATH 環境變數中。例如 C:\MinGW\binC:\Qt\4.4.3\bin。(不知道如何設定環境變數,可以參考這篇文章。)

  然後,執行開始功能表中 Qt 資料夾(預設名稱為 "Qt by Nokia v4.4.3 (OpenSource)")裡的 "Qt 4.4.3 (Build Debug Libraries)",以建立 Debug Library。

  剛開始,應該會看到以下這段文字:

 This is the Qt for Windows Open Source Edition.

 You are licensed to use this software under the terms of
 the GNU General Public License (GPL) version 2 or 3.

 Type '2' to view the GNU General Public License version 2 (GPLv2).
 Type '3' to view the GNU General Public License version 3 (GPLv3).
 Type 'y' to accept this license offer.
 Type 'n' to decline this license offer.

 Do you accept the terms of the license?

  這裡是在詢問你同不同意 GNU GPL 的條款。若是要詳細瞭解條款內容,就輸入 23 (GPL的版本),再按下 Enter

  若是同意接受 GNU GPL 條款,就輸入 y 並按下 Enter 繼續安裝的程序吧。


  但是,假如你在之前選擇 MinGW 的地方,也碰上了 w32api 的警告,在這個過程中將會兩項錯誤(若是選擇由鏡像點下載並安裝 MinGW 則不會出現此問題)。

  所幸的是,這兩個問題都已經在網路上找到解決的方法。你可以到這裡閱讀相關的討論。


  第一個錯誤是 MinGW 目錄下 "\include\sspi.h" 的 "error: `UNICODE_STRING' does not name a type"。根據查到的結果,"UNICODE_STRING" 是被定義在 <subauth.h> 標頭檔中的。所以要修正這個問題,請開啟 sspi.h 找到以下程式碼:

#ifndef _SSPI_H
#define _SSPI_H
#if __GNUC__ >=3
#pragma GCC system_header
#endif

#ifdef __cplusplus
extern "C" {
#endif

  並在這段程式碼下面加上這一行:

#include <subauth.h>

  然後存檔關閉,這樣就可以了。


  而碰到的第二個錯誤,則是 Qt 目錄下的 "\src\corelib\arch\qatomic_windows.h" 與 MinGW 目錄下的 "\include\winbase.h" 中有部分函式發生了原型衝突(prototype conflict),也就是相同的函式被重複定義了兩次。

  解決的方法是,開啟 qatomic_windows.h 後,找到以下程式碼:
extern "C" {
    __declspec(dllimport) long __stdcall InterlockedCompareExchange(long *, long, long);
    __declspec(dllimport) long __stdcall InterlockedIncrement(long *);
    __declspec(dllimport) long __stdcall InterlockedDecrement(long *);
    __declspec(dllimport) long __stdcall InterlockedExchange(long *, long);
    __declspec(dllimport) long __stdcall InterlockedExchangeAdd(long *, long);
}

  並將它修改成:

#ifndef __INTERLOCKED_DECLARED
#define __INTERLOCKED_DECLARED
extern "C" {
    __declspec(dllimport) long __stdcall InterlockedCompareExchange(long *, long, long);
    __declspec(dllimport) long __stdcall InterlockedIncrement(long *);
    __declspec(dllimport) long __stdcall InterlockedDecrement(long *);
    __declspec(dllimport) long __stdcall InterlockedExchange(long *, long);
    __declspec(dllimport) long __stdcall InterlockedExchangeAdd(long *, long);
}
#endif

  以巨集的方式避開重複定義,這樣就沒有問題了。


  話說回來,這個建立 Debug Library 的過程其實相當久(約兩個小時)。

  確認沒有問題之後,建議就別盯著發呆,開個即時通聊天也好


  完成建置工作之後,請點選「開始」中的「執行」,並輸入 "cmd" 以開啟命令列提示工具。

  接著,我們要將所在目錄移到 Qt 的根目錄中。請輸入 "cd" 加上 Qt 的所在目錄,例如:

cd C:\Qt\4.4.3

  然後,再輸入以下命令:

make

  這一個步驟也相當耗時。想睡的,甚至可以回去補個眠了(無誤)。


  等到睡醒了,發現 make 的步驟也順利完成了。

  最後,我們需要將一些不必要的檔案清除,請輸入以下命令:

make clean

  安裝到這裡,就大功告成囉!

5 回覆:

kgame 智涵 提到...

那可以引入VC++2008編譯器嗎?

Unknown 提到...

可以的。你可以參考看看官方的安裝說明:
http://doc.trolltech.com/4.4/install-win.html

Unknown 提到...

感恩也!!!最近正在為安裝Qt-4.4.3所困惑,想說試試直接下載MinGW來安裝,不要從Norway下載,結果出了一些問題,感覺蠻挫折的,不過你這篇文章都解答了也...我會再試試看看

看樣子,你做的研究比較透徹,我只是把遇到的問題寫出來,唉...真慚愧

你這篇文章,應該是以前的文章再做更新的吧?

還有就是,我之前試出來,不去建立Debug Library,仍然可以make debug,所以我就懶的去做,想說這只是證明Qt的Open Source code是真的可以重新建立出來

還有文章最後到Qt目錄去做make和make clean,是要產生什麼的?是為了產生Release Library嗎?

Unknown 提到...

別這麼說,其實我是先注意到你的文章,有提到灌新版 Qt 用非官方的 MinGW 會有錯誤,才特地去試看看的(原本還懶得更新, 打算等 4.5 版釋出再說)。

而最後到根目錄上執行 make 命令,是將 Qt 的 source code,還有它的 example,demo 等東西做 compile 的動作。至於 make clean,則是把 compile 遺留下來的物件檔(.o)移除。

不過,跳過建立 Debug Library 的動作我還沒試過。從其使用的 makefile 看來,應該在 Qt 根目錄下執行 make 時也會把 Debug Library 作編譯。這點我還要查查,感謝你的提醒囉。

另外,這篇文章確實是改以前 4.4.1 版的文章。

匿名 提到...

真的很感謝你

張貼留言