Qt入門之基礎篇(三):掌握Qt4的靜態編譯基本方法


轉載載請注明出處:CN_Simo.

導語:  

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

文章思路:

  1. 准備編譯所需環境及文件;
  2. 編譯Qt4.8.6源碼;(此過程或許要花掉你一上午的時間,要有良好的心理素質哦!
  3. 配置Qt靜態庫到Qt Creator;
  4. 靜態模式重新編譯Hello World程序;
  5. 找到exe程序與之前版本進行大小對比;
  6. 總結說明。

 


 

Let‘s start:

編譯准備:

所需環境:

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

所需文件:

前期工作:

 

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

我將zip解壓到E盤,qmake.conf文件就在源碼目錄\mkspecs\win32-g++中,用記事本打開修改下列參數:QMAKE_LFLAGSQMAKE_LFLAGS_DLL。參數值為 -static,如下圖:
static_1
修改完之后,我在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]!

結束語:      

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM