1. 程式人生 > >詳解 Qt 選擇性編譯和庫裁減 qconfig(轉載)

詳解 Qt 選擇性編譯和庫裁減 qconfig(轉載)

Qt 選擇性編譯裁減是本文將要介紹的內容,編譯一次Qt要耗費太多的時間,

常常是越著急用它,編起來越慢。其實通過很簡單的幾招可以幫你節省編譯的時間。

下面就一一道來:

編譯之前確定哪些功能是不必要的,對編譯樹進行簡單裁剪

比如最常見的,像demos, examples,雖然很有參考價值,

但完全可以放在後面用到的時候再單獨編譯小工程,這樣可以節省不少時間。經過實踐,最簡單的方法是修改configure檔案,在該檔案中有個指定編譯目錄的欄位:

  1. QT_DEFAULT_BUILD_PARTS=”libs tools examples demos docs translations” 

可以把examples、demos和docs從這裡去掉,但要注意,別的可不能隨便去掉。

如果在後面的使用中發現有些小工程需要編譯了,

可以採用一般編譯Qt程式的方法,

即用Qt安裝目錄bin下的qmake來生成Makefile,同樣可以編譯和測試例子程式碼,一點也不影響使用。

裁剪Qt模組

Qt從4版本開始採用了模組化的形式,將獨立的功能封裝在獨立的裡,所以可以很簡單的去掉一些不需要的,這樣也能節省編譯時間和對硬碟空間的佔用。 Qt的configure配置提供了一些設定模組的方法,如它支援-no-svg和-no-webkit,通過configure的時候加這些選項就可以去掉這部分支援。相應的還有很多小的功能可以通過configure引數的形式配置,具體的參考configure –help的輸出。在檢視configure幫助的時候特別要注意加*號的內容,也就是Qt預設的configure選項,有的時候預設選項可不一定是討人喜歡的哦。

Qt桌面版本預設會盡量多的編譯feature進去,這樣有一定的好處,就是使用者可以用到所有的Qt功能,但壞處也很明顯,那就是編譯出來的Qt超級大,特別是編譯debug版本,基本上要佔1到2G的空間,所以個人感覺研究一下configure的選項還是很有必要的。另外, 預設狀況下有些外掛是不會編譯的,比如資料庫外掛,往往需要使用者自己根據需要編譯,這一點也要注意。

針對嵌入式版本的配置

Qt的嵌入式版本本身就支援feature裁剪,我們可以充分利用這一特性讓Qt庫儘量變小。

具體的做法是要做一個自己的qconfig-[myconfig].h特性檔案,該檔案中定義你要去掉Qt中的哪些feature。

在configure的時候加“-qconfig myconfig” 選項, Qt就會根據你給出的配置檔案來編譯,以達到裁剪的目的。

這裡要強調一下,這種裁剪方式只適用於嵌入式版本

這裡的myconfig可以用任何你喜歡的名字來代替。 在qt的程式碼中已經給出了一些qconfig標頭檔案的例子,預設編譯採用full config也就是不裁剪任何feature。

所有Qt預定義好的qconfig檔案,可以在src/corelib/global/下找到,包括qconfig-minimal.h, qconfig-small.h, qconfig.medium.h,qconfig-large.h和qconfig-dist.h,也就是從裁剪量由多到少都有據可依。

如果要新增你自己的配置檔案,要在src/corelib/global下建立一個

形如qconfig-xxx.h的檔案,這個xxx也就是你要在configure的時候傳入的qconfig引數

一般我們的建議是在桌面上測試階段編譯一個full的版本,再根據你的專案使用Qt feature的情況總結哪些可去掉的feature。 feature之間有千絲萬縷的依賴關係,這個問題也是困擾很多人的難點所在。

具體的依賴可以查閱src/corelib/global/qfeatures.h和src/corelib/global/qfeatures.txt(描述依賴關係的文件)。

另外,Qt裡還提供了一個視覺化的配置依賴的工具,叫做qconfig,在QTDIR/tools/qconfig目錄。該工具需要基於Qt桌面版本編譯。如在我的linux系統下可以用下面的命令來編譯:

1.$cd 原始碼目錄/tools/qconfig  

2.$ /usr/local/Trolltech/Qt-4.4.3/bin/qmake  (這是ubuntu qmake,注意不是板子上的qmake,這個還沒有編譯出來了。)

3.$ make 

編譯成功後執行./qconfig,初始要開啟qfeatures.txt. Qconfig讀取該檔案生成一個樹狀圖,該圖很清楚的顯示出feature之間的依賴關係。如下圖所示,如果你去掉了LINEEDIT這個feature,用到該控制元件的combobox也就不能繼續使用了。有了這個工具裁剪Qt變得簡潔直觀,方便了很多。

選定了你要去掉的feature後點擊選單File->Save As..會彈出儲存檔案的頁面,檔名字應該定義成qconfig-xxx.h的形式,這樣你在configure的時候就可以傳入相應的qconfig引數了。你還可以通過選擇File->Open開啟現有的qconfig-xxx.h檔案,通過修改已經有的檔案更快的編輯配置。

根據筆者測試,未經裁剪的qte4.4.1編譯出來為:

  1. libQtCore.so是2.6M  
  2. libQtGui.so是9.5M 

如果用small來編譯,就能縮小為:

  1. libQtCore.so是2.0M  
  2. libQtGui.so是5.7M 

差異還是比較明顯的。