如何精簡 Qt/Embedded

原作者:M.K.D. and S.H
翻譯:黃敬群 <jimchyun@ccns.ncku.edu.tw>

雖然 Qt 程式庫相對其他嵌入式程式庫來說,是頗大的,但你可透過移除某些功能達到瘦身的目的。我們建議在你還未知曉你的應用程式需要哪些資源的時候,還不要急著作瘦身、精簡化 Qt/Embedded 的動作,因為一旦你開始 stripp 裡頭的 class 時,很可能會造成一個無法二進位相容的程式庫 (binary incompatible library)。

在執行 Qt/Embedded 的 configure script 時,你可以下達 -qconfig 後面加上功能的選項,這些選項有 minimal、small、medium、large,與 local (若你不使用 -qconfig 選項,會讓全部的Qt/Embedded 特徵有效)。每個選項會對應到在 $QTDIR/src/tools/ 的標頭檔:qconfig-minimal.h、qconfig-small.h、qconfig-medium.h、qconfig-large.h、qconfig.h,以及 qconfig-local.h。

Trolltech 把這些標頭檔稱為 "Feature Definition Files" (特徵定義檔)。在 $QTDIR/doc/html/features.html 中,你將會找到一連串的以 QT_NO_ 開頭的巨集,而這每個巨集會讓 Qt 的某項特徵無效。所以,在你配置一個自訂的 Qt 特徵時,把在 src/tools/qconfig-local.h 中,你所不需要的項目記錄下來。你可以使用其他 feature definition 檔作為出發點。值得留意的是,配置設定 "Everything" 對應的是一個空的 feature definition 檔。

建立一個自訂的 Qt 環境就需要一番嘗試與重新編譯的過程。建立一個移去某些功能的 feature definition 檔不難,因為這些功能特徵在很多地方都會處理相依性 (dependency) 的問題 [譯注:這也是為何常在 Qt 程式庫的原始程式碼中看到為數不少的巢狀 preprocessor]。要達到瘦身的方式,最簡單的處理就是把 Qt 中若干選擇性的 modules 移除。如果你不需要那些模組,可以這麼做:

#define QT_NO_TABLE
#define QT_NO_XML
#define QT_NO_CANVAS

光靠以上三個巨集設定,你就在最終 strip 後的程式庫中省下 350 kb 的空間。

成功建構後,你可以透過這個命令把符號 (symbol) 移除:

# strip -R .note -R .comment $QTDIR/lib/libqte.so*


記得,要用給 Linux/ARM 的 strip 工具,而不是用 x86 版的,否則程式庫會毀損。