網上有很多教程了,這里講一下我的過程.什么東西試一試才知道是否正確,只有自己做過以后才記憶深刻.
我安裝的是這個版本,在此之前,VS2008 已經安裝好了.
我安裝的是這個版本,在此之前,VS2008 已經安裝好了.

安裝好了后,直接在開始菜單中運行Qt 4.7.0 Command Prompt 命令行,啟動控制臺窗口
這個命令行實際上是一個批處理文件啟動的,這個批處理文件的內容如下:
//============
@echo off
rem
rem This file is generated by the Qt installer
rem
//============
@echo off
rem
rem This file is generated by the Qt installer
rem
echo Setting up a Qt environment...
set QTDIR=e:\Qt\4.7.0
echo -- QTDIR set to e:\Qt\4.7.0
set PATH=e:\Qt\4.7.0\bin;%PATH%
echo -- Added e:\Qt\4.7.0\bin to PATH
set QMAKESPEC=win32-msvc2008
echo -- QMAKESPEC set to "win32-msvc2008"
echo -- QTDIR set to e:\Qt\4.7.0
set PATH=e:\Qt\4.7.0\bin;%PATH%
echo -- Added e:\Qt\4.7.0\bin to PATH
set QMAKESPEC=win32-msvc2008
echo -- QMAKESPEC set to "win32-msvc2008"
if not "%1"=="vsvars" goto ENDVSVARS
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
:ENDVSVARS
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
:ENDVSVARS
if not "%1"=="vsstart" goto ENDVSSTART
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
devenv /useenv
:ENDVSSTART
call "C:\Program Files\Microsoft Visual Studio 9.0\Common7\Tools\vsvars32.bat"
devenv /useenv
:ENDVSSTART
在命令行下輸入 configure –h 可以看configure程序的幫助
輸入
configure -release -static -fast –no-qmake -no-webkit -no-qt3support -no-plugin-manifests
開始配置要編譯的項目.我對configure程序的理解是,它遍歷當前的*.pro文件,根據這些文件生成對應的Makefike. 而Makefile 文件是告訴編譯器如何編譯項目文件
靜態的QT 框架,有兩個“靜態”級別:
一是不依賴QtCore4.dll 等動態鏈接庫,但這種級別的靜態庫還是要依賴 Msvcp90.dll Msvcrt90.dll,這些Runtime庫并沒有一起靜態進去。
二是完全靜態,連Msvcp90.dll Msvcrt90.dll,這些Runtime庫一并靜態包含,這樣在沒有QT運行庫,也沒有VC9.0文件庫的用戶機器上也能很好的運行。
第一種,我已經試過了,跳過下面的步驟,不修改qmake.conf 即可,這里我們要編譯第二種,因為想靜態,就徹底點,畢竟編譯一次不容易。
在qt的安裝目錄下找到mkspecs目錄,這個目錄下安裝的是各種開發環境的環境變量。這里我們修改win32-msvc2008 ,打開qmake.conf 文件,這是一個文本文件,把下面紅圈中的 QMAKE_CFLAGS_RELEASE 和 QMAKE_CFLAGS_DEBUG 中的 -MD -MDd 分別修改為 -MT 和 -MTd 即可,MT是把vc的Runtime也包含進來。
設置好了,運行configure程序,必須在這之前設置qmake.conf文件,否則改動不會在configure配置之后的Makefile文件中體現。
這個項目我先后編譯過兩次,第一使用的參數是:
Configure –static –fast –no-qmake –no-webkit
在正式編譯之前,我還試過 Configure –static –no-webkit 這樣的參數組合,配置過程非常的漫長,但后來用Configure –static –fast –no-qmake –no-webkit 則非常的快,沒有細究–fast –no-qmake 參數到底做了那些事。
配置完成以后,在命令行輸入 nmake 開始編譯,編譯過程非常的漫長,估計只少有5個小時。難以想象,如果把 qtwebkit 一起編譯有多么可怕。編譯完成以后,目錄增大了23G。
后來分析,很多demo ,example 是沒有必要編譯的。 第一次編譯時是沒有修改qmake.conf的,編譯完畢,能生成靜態庫,用DEPEND查看,需要msvcrt90.dll 和 msvcp90.dll。
第二次編譯使用的configure參數是:
Configure –static –fast –no-qmake –no-webkit –no-qt3support –no-plugin-manifests
QT3 我是沒有用過,我們公司也沒有在QT3上的遺留產品,因此這個肯定不要了。最后一個參數我不是太明白,但網上推薦這么做,也就加上了。
回車以后會出現下面的界面,網上都沒有人介紹,第一步是選擇QT的版本,是LGPL版還是商業版,我這里用的是LGPL版本,因此選o 回車。
接下來會提示是否接受LGPL協議,輸入y確認。
配置過程中會顯示一些開關的默認選項,以及一些目錄的地址。
簡單警告提示后幾秒鐘開始自動生成Makefile文件。
如果之前用過不同的參數配置,那么需要先運行 nmake confclean , 但這個命令我沒有成功過。似乎網上也有人說沒有成功。
直接這么nmake 會非常的耗時,因為它會把當前目錄下所有的Makefile都編譯生成一遍
當然也包含Demos 和Example 目錄
因為我們只會用到Src目錄下的東西,因此,在命令行下輸入 cd src 回車,然后在運行nmake。只編譯src目錄下的相關文件
經過一個多小時的時間就編譯完了,很快。
看看 cl的參數 –O2 –MT ,說明它是靜態編譯的。
接下來在這個目錄下運行 nmake clean 刪除編譯過程中的臨時文件。 OK 任務完成了。
用QtCreator 創建了一個最簡單的UI程序,編譯后,Release版本有5.4M大小,用Depend看,以及不依賴QtCore4.dll 和 其他dll 了,當然Msvcp90.dll 和Msvcrt90.dll也不用依賴了。
我還發現了一件有趣的事,靜態編譯后的lib文件還是放在lib目錄下,同樣QtCore項目編譯的動態庫是 QtCore4.lib 和 QtCore4d.lib ,而而靜態庫是 QtCore.lib 和 QtCored.lib ,那么編譯器又是如何找到它們的呢? 這個我還沒有細細的研究。
當我編譯靜態庫以后,創建的新項目會自動使用靜態鏈接,也就是說,我在.pro文件中沒有寫
CONFIG += static
它也會自動去鏈接靜態Lib。
接下來我又做了一個實驗,把qmake.conf 中的MT,MTd 該為 MD ,MDd。
重新生成這個項目,鏈接的時候報錯了,
@C:\DOCUME~1\tase\LOCALS~1\Temp\TestStatic.exe.26166109.jom
LIBCMT.lib(invarg.obj) : error LNK2005: __invoke_watson 已經在 MSVCRT.lib(MSVCR90.dll) 中定義
LIBCMT.lib(invarg.obj) : error LNK2005: __invalid_parameter_noinfo 已經在 MSVCRT.lib(MSVCR90.dll) 中定義
LINK : warning LNK4098: 默認庫“LIBCMT”與其他庫的使用沖突;請使用 /NODEFAULTLIB:library
release\TestStatic.exe : fatal error LNK1169: 找到一個或多個多重定義的符號
看來是庫不兼容啊!
正式使用的時候,把靜態編譯的QT 目錄單獨使用,動態庫在這里是用不著了!
個人感覺用QT是不適合靜態編譯的,QT的靜態編譯EXE文件太大了,一個什么都不做的exe就有5M之多。相比之下還是VC6靜態編譯效果好!
但我們用QT,又有幾個人在乎它的靜態編譯呢?