1. 程式人生 > >Qt 4.6.2在VS2005,VS2008,MinGW環境下的靜態編譯

Qt 4.6.2在VS2005,VS2008,MinGW環境下的靜態編譯

編譯準備

或者直接下載原始碼:http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.2.zip

下載後安裝好的目錄結構為(假設安裝到D:/QT):
├─share
├─lib
├─bin
├─mingw
└─qt
    ├─translations(QT語言檔案目錄)
    ├─tools(QT相關工具原始碼目錄)
    ├─src(原始碼目錄)
    ├─qmake(qmake原始碼目錄)
    ├─plugins(圖形,資料庫等外掛目錄)
    ├─mkspecs(平臺配置檔案)
    ├─lib(庫檔案)
    ├─include(標頭檔案)
    ├─examples(示例程式)
    ├─doc(文件)
    ├─demos(演示程式)
    ├─config.tests
    ├─bin(命令列工具)
    └─qtc-debugging-helper

configure配置工具在qt目錄,以下假設QTDIR=D:/QT/SDK/qt,編譯前最好清空lib,demos,examples,docs四個目錄,配置完成後在這幾個目錄下放一個空的Makefile檔案,避免make時報錯。


VS2005動態編譯

1.設定VS2005的環境變數
2.設定目標平臺
set QMAKESPEC=win32-msvc2005
3.進入QTDIR目錄執行配置,生成Makefile檔案
configure -platform win32-msvc2005 -release -opensource -shared -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
4.執行nmake /I /K(附帶/I /K 選項可以避免出現錯誤時編譯自動終止,用於跳過錯誤繼續編譯其它檔案)

經過這樣編譯的Qt庫不依賴mingwm10.dll,libgcc_s_dw2-1.dll,但依賴Qt庫的Dll檔案和微軟的CRT執行時庫,使用此Qt庫編譯Windows平臺下的程式,釋出時需帶上用到的Qt連結庫Dll檔案和微軟的CRT執行時庫Dll檔案。


VS2005靜態編譯
(VS2008編譯同理,啟動相應的命令列,設定相應的目標平臺,修改相應的配置檔案)
1.設定VS2005的環境變數
2.設定目標平臺
set QMAKESPEC=win32-msvc2005
3.修改mkspecs/win32-msvc2005目錄下的配置檔案qmake.conf
將下面兩行:
QMAKE_CFLAGS_RELEASE    = -O2 -MD
QMAKE_CFLAGS_DEBUG      = -Zi -MDd
修改為:
QMAKE_CFLAGS_RELEASE    = -O2 -MT
QMAKE_CFLAGS_DEBUG      = -Zi -MTd
(D是指dynamic,T是指static,d是指debug)
4.進入QTDIR目錄,執行配置,生成Makefile檔案
set QMAKESPEC=win32-msvc2005
configure -platform win32-msvc2005 -release -no-exceptions -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
5.執行執行nmake /I /K

經過這樣編譯的Qt庫不依賴於任何Dll檔案(如微軟的CRT執行時庫),使用此Qt庫編譯Windows平臺下的程式釋出時不需要附帶任何額外的Dll檔案。


MinGW靜態編譯

1.設定MinGW的環境變數
2.設定目標平臺
set QMAKESPEC=win32-g++
3.修改mkspecs/win32-g++目錄下的配置檔案qmake.conf
將下面一行:
QMAKE_LFLAGS = -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
修改為:
QMAKE_LFLAGS = -static -enable-stdcall-fixup -Wl,-enable-auto-import -Wl,-enable-runtime-pseudo-reloc
然後將下面一行:
QMAKE_LFLAGS_DLL        = -shared
修改為:
QMAKE_LFLAGS_DLL        = -static
4.QTDIR目錄,執行配置,生成Makefile檔案
set QMAKESPEC=win32-g++
configure -platform win32-g++ -release -no-exceptions -opensource -static -fast -qt-sql-sqlite -plugin-sql-sqlite -no-qt3support  -qt-zlib -qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg -no-webkit -qt-style-windowsxp -qt-style-windowsvista
5.執行執行mingw32-make -i -k(-i -k選項的含義與上面nmake的相同)

 經過這樣編譯的Qt庫,不依賴任何Dll檔案(如mingwm10.dll,libgcc_s_dw2-1.dll),使用此Qt庫編譯的Windows平臺下的程式釋出時不需要附帶任何額外的Dll檔案。

編譯事項說明

編譯完成後可以刪除bin目錄中所有不是當前編譯日期的檔案。

建議編譯前移除examples和demos資料夾的所有檔案,避免重編譯這兩個資料夾,加快編譯速度。

另外,編譯命令請根據自己的實際情況配置,上面我的配置是(以VS2005靜態編譯為例):
-platform win32-msvc2005 目標平臺
-release 關閉除錯資訊
-no-exceptions 除去異常支援
-opensource 開源版
-static 建立靜態庫
-fast 快速配置,只生成Qt庫檔案及子目錄的Makefile檔案,其它的Makefile檔案後面再使用qmake生成
-qt-sql-sqlite SQLite驅動支援
-plugin-sql-sqlite  SQLite連結外掛支援
-no-qt3support  不編譯Qt3相容庫
-qt-zlib zlib庫
-qt-gif -qt-libpng -qt-libmng -qt-libtiff -qt-libjpeg 圖形格式外掛庫
-no-webkit 不編譯webkit,此選項可極大加快編譯速度,需要使用WebKit的可以刪除此選項
-qt-style-windowsxp -qt-style-windowsvista 支援XP和Vista主題樣式

注意:使用靜態編譯的程式通常較大,建議釋出前使用UPX壓縮,一般可以減少至少50%的大小。