[Qt5] 減少dll依賴和大小(特別是webkit的大小和依賴)


Qt5的依賴太多, 而且很dll非常大. 折騰了好久, 摸索了一些精簡的方法. 

webkit是個非常蛋疼的東西, 依賴超多, 又很龐大. 所以需不需要webkit是完全不同的. 

如何編譯Qt5可以參考本人之前一篇文章 http://www.cnblogs.com/lingdhox/p/3457419.html

一. 

1. 在configure時去掉不需要的模塊, 比如openssl, icu等. 

configure -opensource -developer-build -mp -platform win32-msvc2010 -nomake examples -nomake tests -no-icu  -no-openssl -no-iconv -no-qml-debug -no-plugin-manifests

更多參數可以configure -help 查看

-no-plugin-manifests 去掉插件dll的manifests文件

需要注意:  如果要使用webkit, 那么icu是必須的.

2. 在configure時, 指定qconfig文件 

   該方法在嵌入式中使用較多, Qt支持feature裁剪. 

 在qtbase\src\corelib\global\下有一些qconfig-xxx.h的文件, 就是指定了不同的feature. 

   Qt tools下有個工程qttools\src\qtconfig , 編譯這個項目, 運行后, 是一個圖形化的裁剪feature工具. 它打開qtbase\src\corelib\global\下的qfeatures.txt,  然后你可以自由選擇需要的feature, 保存成qconfig-myconfig.h

   然后在運行configure時. 添加 -qconfig myconfig

   我試過這個方法, 但結果是有些地方引用頭文件出錯. 而且沒有用到feature很少, 就不深入研究了.

 

3. 去掉webkit的quick qml printsupport sensors Qt5V8依賴, 並裁剪webkit本身的大小

打開qtwebkit\Tools\qmake\mkspecs\features下的configure.prf  、features.prf和features.pri

features.prf中注釋這四行(加#)

    #haveQtModule(quick): WEBKIT_CONFIG += have_qtquick
    #else: CONFIGURE_WARNINGS += "QtQuick module not found, QML APIs will not be built"

    #haveQtModule(printsupport): WEBKIT_CONFIG += have_qtprintsupport
    #haveQtModule(sensors): WEBKIT_CONFIG += orientation_events device_orientation

  

這樣編譯出來的webkit.dll不依賴quick qml printsupport sensors

 

features.prf中這幾行config

config_libxml2: WEBKIT_CONFIG += use_libxml2
config_libxslt: WEBKIT_CONFIG += xslt
config_libzlib: WEBKIT_CONFIG += use_zlib
config_libwebp: WEBKIT_CONFIG += use_webp

的定義在qtCompileTest中

qtbase\mkspecs\features\configure.prf下的解釋

# Try to build the test project in $$QMAKE_CONFIG_TESTS_DIR/$$1
# ($$_PRO_FILE_PWD_/config.tests/$$1 by default).
#
# If the test passes, config_$$1 will be added to CONFIG.
# The result is automatically cached. Use of cached results
# can be suppressed by passing CONFIG+=recheck to qmake.
#
# Returns: true iff the test passes
defineTest(qtCompileTest) {
positive = config_$$1
done = done_config_$$1

done_config_$$1會輸出到.qmake.cache

比如qtimageformats\qtimageformats.pro 中添加libwebp

requires(qtHaveModule(gui))

load(configure)
qtCompileTest(jasper)
qtCompileTest(libmng)
qtCompileTest(libtiff)
qtCompileTest(libwebp)

load(qt_parts)

 

configure.prf 中把

    WEBKIT_CONFIG += \
        build_webkit1 \
        build_webkit2 \
        build_tests \
        $$WEBKIT_TOOLS_CONFIG

  改成

    WEBKIT_CONFIG += \
        build_webkit1 \
        build_tests \
        $$WEBKIT_TOOLS_CONFIG

  

不編譯webkit2 , webkit2依賴Qt5V8,  提升HTML5 , js, qml 的支持. 並提升性能. 

需不需要就看情況了

features.pri 中一堆宏, 用於控制特性. 需要自己檢查那些特性不需要. 

 

注意: 這三個文件的修改要在編譯前. 

qtwebkit\makefile是在.\makefile中編譯module-qtwebkit時動態生成的(不存在才會生成)

所以如果修改三個文件后, 想重新編譯, 需要刪除webkit下新生成的所有makefile

makefile

source\Makefile.api
source\Makefile.api.Debug
source\Makefile.api.Release
source\Makefile.widgetsapi
source\Makefile.widgetsapi.Debug
source\Makefile.widgetsapi.Release
source\Makefile.QtWebKit

source\JavaScriptCore\Makefile.jsc
source\JavaScriptCore\Makefile.jsc.Debug
source\JavaScriptCore\Makefile.jsc.Release
source\JavaScriptCore\Makefile.LLIntOffsetsExtractor
source\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Debug
source\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Release
source\JavaScriptCore\Makefile.JavaScriptCore.DerivedSources
source\JavaScriptCore\Makefile.JavaScriptCore
Makefile.JavaScriptCore.Target
Makefile.JavaScriptCore.Target.Debug
Makefile.JavaScriptCore.Target.Release

Source\WebCore\Makefile.WebCore.DerivedSources
Source\WebCore\Makefile.WebCore.Target
Source\WebCore\Makefile.WebCore.Target.Debug
Source\WebCore\Makefile.WebCore.Target.Release
Source\WebCore\Makefile.WebCore
Source\WebKit\Makefile.WebKit1
Source\WebKit\Makefile.WebKit1.Debug
Source\WebKit\Makefile.WebKit1.Release
Source\WebKit2\Makefile.WebKit2.DerivedSources
Source\WebKit2\Makefile.WebProcess
Source\WebKit2\Makefile.WebProcess.Debug
Source\WebKit2\Makefile.WebProcess.Release
Source\WebKit2\Makefile.WebKit2.Target
Source\WebKit2\Makefile.WebKit2.Target.Debug
Source\WebKit2\Makefile.WebKit2.Target.Release
Source\WebKit2\Makefile.WebKit2
source\wtf\Makefile.WTF
source\wtf\Makefile.WTF.Debug
source\wtf\Makefile.WTF.Release
Source\ThirdParty\ANGLE\Makefile.ANGLE.Target
Source\ThirdParty\ANGLE\Makefile.ANGLE.Target.Debug
Source\ThirdParty\ANGLE\Makefile.ANGLE.Target.Release
Source\ThirdParty\ANGLE\Makefile.ANGLE
Source\ThirdParty\ANGLE\Makefile.ANGLE.DerivedSources
Source\WebKit\qt\declarative\Makefile.declarative.public
Source\WebKit\qt\declarative\Makefile.declarative.public.Debug
Source\WebKit\qt\declarative\Makefile.declarative.public.Release
Source\WebKit\qt\declarative\Makefile.declarative
Source\WebKit\qt\declarative\experimental\Makefile.declarative.experimental
Source\WebKit\qt\declarative\experimental\Makefile.declarative.experimental.Debug
Source\WebKit\qt\declarative\experimental\Makefile.declarative.experimental.Release

  

需要刪除這些, 所以我覺得從壓縮包里重新拷貝一份qtwebkit的源碼出來編譯, 更方便.  環境也更干凈

運行 nmake module-qtwebkit 然后會生成一個.qmake.cache

打開可以看到WEBKIT_CONFIG (即剛才修改的選項)

 

4. 裁剪icu的大小, icudt*.dll, icuin*.dll, icuuc*.dll

 http://userguide.icu-project.org/icufaq

How can I reduce the size of the ICU data library?

 

1). 根據官方faq的方法, 定制自己需要的數據

http://apps.icu-project.org/datacustom/

先在get data library下選擇版本, 比如 ICU 51 Data 

然后選擇自己的需要的語言版本. 這樣最后的icudt51l.dat 大概在幾M左右. 

2). 下載對應版本的源碼包. 

替換icu\source\data\in 下的icudt*l.dat

打開icu\source\allinone的VS工程

編譯.  最終生成的文件icu\ 下 

 

 

5. 最終生成的dll:

Qt5WebKit.dll 10M

icudt51.dll  3M

icuin51.dll   1.3M

icuuc51.dll  1M


免責聲明!

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



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