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
更多参数可以configure -help 查看
需要注意: 如果要使用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
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
makefilesource\Makefile.apisource\Makefile.api.Debugsource\Makefile.api.Releasesource\Makefile.widgetsapisource\Makefile.widgetsapi.Debugsource\Makefile.widgetsapi.Releasesource\Makefile.QtWebKitsource\JavaScriptCore\Makefile.jscsource\JavaScriptCore\Makefile.jsc.Debugsource\JavaScriptCore\Makefile.jsc.Releasesource\JavaScriptCore\Makefile.LLIntOffsetsExtractorsource\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Debugsource\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Releasesource\JavaScriptCore\Makefile.JavaScriptCore.DerivedSourcessource\JavaScriptCore\Makefile.JavaScriptCoreMakefile.JavaScriptCore.TargetMakefile.JavaScriptCore.Target.DebugMakefile.JavaScriptCore.Target.ReleaseSource\WebCore\Makefile.WebCore.DerivedSourcesSource\WebCore\Makefile.WebCore.TargetSource\WebCore\Makefile.WebCore.Target.DebugSource\WebCore\Makefile.WebCore.Target.ReleaseSource\WebCore\Makefile.WebCoreSource\WebKit\Makefile.WebKit1Source\WebKit\Makefile.WebKit1.DebugSource\WebKit\Makefile.WebKit1.ReleaseSource\WebKit2\Makefile.WebKit2.DerivedSourcesSource\WebKit2\Makefile.WebProcessSource\WebKit2\Makefile.WebProcess.DebugSource\WebKit2\Makefile.WebProcess.ReleaseSource\WebKit2\Makefile.WebKit2.TargetSource\WebKit2\Makefile.WebKit2.Target.DebugSource\WebKit2\Makefile.WebKit2.Target.ReleaseSource\WebKit2\Makefile.WebKit2source\wtf\Makefile.WTFsource\wtf\Makefile.WTF.Debugsource\wtf\Makefile.WTF.ReleaseSource\ThirdParty\ANGLE\Makefile.ANGLE.TargetSource\ThirdParty\ANGLE\Makefile.ANGLE.Target.DebugSource\ThirdParty\ANGLE\Makefile.ANGLE.Target.ReleaseSource\ThirdParty\ANGLE\Makefile.ANGLESource\ThirdParty\ANGLE\Makefile.ANGLE.DerivedSourcesSource\WebKit\qt\declarative\Makefile.declarative.publicSource\WebKit\qt\declarative\Makefile.declarative.public.DebugSource\WebKit\qt\declarative\Makefile.declarative.public.ReleaseSource\WebKit\qt\declarative\Makefile.declarativeSource\WebKit\qt\declarative\experimental\Makefile.declarative.experimentalSource\WebKit\qt\declarative\experimental\Makefile.declarative.experimental.DebugSource\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
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
联系客服