轉載載請注明出處:CN_Simo.
導語:
前兩章都提到過“靜態編譯”(Static Compilation),在Windows下一次靜態編譯差不多需要長達三個小時才能完成,而且還非常容易由於各種原因而出錯。那么為什么要花這時間去干這件事情呢!我當初只是想用Qt做一個exe賀卡發給同學,但是通常情況下,我們做出的exe需要各種dll動態鏈接文件才能正常運行(壓縮打包給別人?直接發送一個exe文件都懶得打開,更何況還需要解壓呢),那么我就想能不能只需要一個exe就可以呢?
“靜態編譯”的作用正是讓exe脫離dll的束縛,但是同時你的exe可能比之前要大好幾倍(沒辦法,萬物都無絕對完美)。前言說到這里,我們就進入正文來:
文章思路:
- 准備編譯所需環境及文件;
- 編譯Qt4.8.6源碼;(此過程或許要花掉你一上午的時間,要有良好的心理素質哦!)
- 配置Qt靜態庫到Qt Creator;
- 靜態模式重新編譯Hello World程序;
- 找到exe程序與之前版本進行大小對比;
- 總結說明。
Let‘s start:
編譯准備:
所需環境:
配置當然是越好越快了,我的配置編譯了一上午。

所需文件:
- qt-everywhere-opensource-src-4.8.6.zip
- 教程一中安裝好的Qt(版本4或5都可)
前期工作:
步驟一:配置編譯文件qmake.conf
我將zip解壓到E盤,qmake.conf文件就在源碼目錄\mkspecs\win32-g++中,用記事本打開修改下列參數:QMAKE_LFLAGS和QMAKE_LFLAGS_DLL。參數值為 -static,如下圖:
修改完之后,我在E盤新建一個“qt4.8.6_static”文件夾作為編譯輸出目錄,並且需要將更改后的“mkspecs”文件夾復制到qt4.8.6_static文件夾中。若不做此操作步驟三可能會報錯,類似下面這樣
Could not find mkspecs for your QMAKESPEC(win32-g++) after trying: E:/qt/qt4.8.6_static\mkspecs
步驟二:設置環境變量以及所需編譯內容
開始菜單中打開Qt命令窗口,cd命令進入源碼目錄:
e:&cd e:\qt-everywhere-opensource-src-4.8.6
下面所有操作都在本目錄中進行。
輸入以下兩條命令:
set QMAKESPEC=win32-g++ configure -confirm-license -opensource -prefix “F:\Qt\Qt_4.8.6_static” -debug-and-release -static -platform win32-g++ -nomake demos -nomake examples -nomake tests -fast -mp
- set命令設置環境變量(注意:窗口關閉將清空設置,需重新設置)
- configure命令配置編譯內容,參數說明:
開始編譯:
mingw32-make
輸入命令開始編譯,此過程最易出錯,因為持續時間長,中間可能遇到很多自己解決不了的問題,此時只能是重新開始。如果過程中未出錯的話可能需要3個小時以上才能結束(我的電腦配置見上),你可以去做別的事情了,在編譯過程中最好不要用電腦去做其他占用大量系統資源的事情,因為這么做將會大大增加失敗的幾率。
編譯結束:
結束之后,輸入下面命令開始一大堆的復制命令,這時你可以看到qt4.8.6_static目錄已經開始急劇膨脹了。
mingw32-make install
大概15分鍾即可復制完畢。
要注意,如果移動或者更名qt4.8.6_static目錄,將導致bin目錄中的程序異常,下面操作可解決此問題:
在bin目錄下創建一個qt.conf文件,內容這么寫:
[paths] Prefix = ..
如此,便可進行移動或更名操作了。
配置Qt Creator:
打開qt creator,【工具】-【選項】-【構建和運行】,在里面添加剛編譯出的qt4.8.6靜態版本(qmake路徑選擇bin目錄中的qmake.exe哦),之后添加新的構建套件,qt版本選擇qt4.8.6,名稱隨意,如下圖:
Hello World測試:
【新建】一個project,構建套件選擇剛剛添加的。在這里,我續用教程二中的helloworld項目測試一下。
打開helloworld項目后,crlt+5將新的構建套件添加上去,點擊左下角【部署構建套件】按鈕分別選擇原有Kit和靜態版Kit的release版本運行項目,幾秒鍾后即可看到helloworld運行界面:
exe文件對比:
尋找exe生成目錄,找到兩個exe文件,驚奇的發現了這個結果:
(右面是由我們的qt靜態庫編譯生成的程序,左面則是原來的)
結果顯示:
- 同樣是release版本的,所產生的helloworld程序大小完全不在一個等級(一個KB級別,一個MB級別),靜態編譯敗;
- 動態編譯出的exe文件想要打開需要dll動態鏈接文件的支持,靜態鏈接編譯出的exe文件則可以直接打開,不再需要dll文件的束縛,靜態編譯勝;
總結說明:
通過上面結果可以看出:動態編譯和靜態編譯都有各自優缺點,我們應該適當選擇自己所需;
qt源碼編譯的過層拖得越長越是容易出錯誤,選擇一台配置好點的電腦可以適當增加編譯速度;
通過本章知識,我們的內心或許會嫌麻煩又或許會覺得很有趣,如果你是后者希望以后的學習你能夠越來越出色。
讓我們一起期待下期內容吧[@CN_Simo]!



