導語:  

        前兩章都提到過“靜態(tài)編譯”(Static Compilation),在Windows下一次靜態(tài)編譯差不多需要長達三個小時才能完成,而且還非常容易由于各種原因而出錯。那么為什么要花這時間去干這件事情呢!我當初只是想用Qt做一個exe賀卡發(fā)給同學,但是通常情況下,我們做出的exe需要各種dll動態(tài)鏈接文件才能正常運行(壓縮打包給別人?直接發(fā)送一個exe文件都懶得打開,更何況還需要解壓呢),那么我就想能不能只需要一個exe就可以呢?
      “靜態(tài)編譯”的作用正是讓exe脫離dll的束縛,但是同時你的exe可能比之前要大好幾倍(沒辦法,萬物都無絕對完美)。前言說到這里,我們就進入正文來:

文章思路:

  1. 準備編譯所需環(huán)境及文件;

  2. 編譯Qt4.8.6源碼;(此過程或許要花掉你一上午的時間,要有良好的心理素質哦!

  3. 配置Qt靜態(tài)庫到Qt Creator;

  4. 靜態(tài)模式重新編譯Hello World程序;

  5. 找到exe程序與之前版本進行大小對比;

  6. 總結說明。

 


 

Let‘s start:

編譯準備:

所需環(huán)境:

配置當然是越好越快了,我的配置編譯了一上午。

seo優(yōu)化培訓,網(wǎng)絡推廣培訓,網(wǎng)絡營銷培訓,SEM培訓,網(wǎng)絡優(yōu)化,在線營銷培訓

所需文件:

前期工作:

 

步驟一:配置編譯文件qmake.conf

我將zip解壓到E盤,qmake.conf文件就在源碼目錄\mkspecs\win32-g++中,用記事本打開修改下列參數(shù):QMAKE_LFLAGSQMAKE_LFLAGS_DLL。參數(shù)值為 -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

步驟二:設置環(huán)境變量以及所需編譯內(nèi)容 

開始菜單中打開Qt命令窗口,cd命令進入源碼目錄:

1
e:&cd e:\qt-everywhere-opensource-src-4.8.6

下面所有操作都在本目錄中進行。 

輸入以下兩條命令:

 

1
2
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命令設置環(huán)境變量(注意:窗口關閉將清空設置,需重新設置

  • configure命令配置編譯內(nèi)容,參數(shù)說明:


回車后,看到以下信息代表完成:

開始編譯:

1
mingw32-make

輸入命令開始編譯,此過程最易出錯,因為持續(xù)時間長,中間可能遇到很多自己解決不了的問題,此時只能是重新開始。如果過程中未出錯的話可能需要3個小時以上才能結束(我的電腦配置見上),你可以去做別的事情了,在編譯過程中最好不要用電腦去做其他占用大量系統(tǒng)資源的事情,因為這么做將會大大增加失敗的幾率。

編譯結束:

 結束之后,輸入下面命令開始一大堆的復制命令,這時你可以看到qt4.8.6_static目錄已經(jīng)開始急劇膨脹了。

1
mingw32-make install

大概15分鐘即可復制完畢。
注意,如果移動或者更名qt4.8.6_static目錄,將導致bin目錄中的程序異常,下面操作可解決此問題:
在bin目錄下創(chuàng)建一個qt.conf文件,內(nèi)容這么寫:

1
2
[paths]
Prefix = ..

如此,便可進行移動或更名操作了。

配置Qt Creator:

 打開qt creator,【工具】-【選項】-【構建和運行】,在里面添加剛編譯出的qt4.8.6靜態(tài)版本(qmake路徑選擇bin目錄中的qmake.exe哦),之后添加新的構建套件,qt版本選擇qt4.8.6,名稱隨意,如下圖:

Hello World測試:

 【新建】一個project,構建套件選擇剛剛添加的。在這里,我續(xù)用教程二中的helloworld項目測試一下。
打開helloworld項目后,crlt+5將新的構建套件添加上去,點擊左下角【部署構建套件】按鈕分別選擇原有Kit和靜態(tài)版Kit的release版本運行項目,幾秒鐘后即可看到helloworld運行界面:

exe文件對比:

尋找exe生成目錄,找到兩個exe文件,驚奇的發(fā)現(xiàn)了這個結果:

(右面是由我們的qt靜態(tài)庫編譯生成的程序,左面則是原來的)

結果顯示:

  • 同樣是release版本的,所產(chǎn)生的helloworld程序大小完全不在一個等級(一個KB級別,一個MB級別),靜態(tài)編譯敗;

  • 動態(tài)編譯出的exe文件想要打開需要dll動態(tài)鏈接文件的支持,靜態(tài)鏈接編譯出的exe文件則可以直接打開,不再需要dll文件的束縛,靜態(tài)編譯勝;

 


 

總結說明:

  通過上面結果可以看出:動態(tài)編譯和靜態(tài)編譯都有各自優(yōu)缺點,我們應該適當選擇自己所需;
qt源碼編譯的過層拖得越長越是容易出錯誤,選擇一臺配置好點的電腦可以適當增加編譯速度;
通過本章知識,我們的內(nèi)心或許會嫌麻煩又或許會覺得很有趣,如果你是后者希望以后的學習你能夠越來越出色。
讓我們一起期待下期內(nèi)容吧[@CN_Simo]!

結束語:      

上一篇:Qt入門之基礎篇(二):Qt項目建立、編譯、運行和發(fā)布過程解析