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

webkit是个非常蛋疼的东西, 依赖超多, 又很庞大. 所以需不需要webkit是完全不同的.

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

一.

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

  1. 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中注释这四行(加#)

  1. #haveQtModule(quick): WEBKIT_CONFIG += have_qtquick
  2. #else: CONFIGURE_WARNINGS += "QtQuick module not found, QML APIs will not be built"
  3.  
  4. #haveQtModule(printsupport): WEBKIT_CONFIG += have_qtprintsupport
        #haveQtModule(sensors): WEBKIT_CONFIG += orientation_events device_orientation

  

这样编译出来的webkit.dll不依赖quick qml printsupport sensors

features.prf中这几行config

  1. config_libxml2: WEBKIT_CONFIG += use_libxml2
  2. config_libxslt: WEBKIT_CONFIG += xslt
  3. config_libzlib: WEBKIT_CONFIG += use_zlib
  4. config_libwebp: WEBKIT_CONFIG += use_webp

的定义在qtCompileTest中

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

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

done_config_$$1会输出到.qmake.cache

比如qtimageformats\qtimageformats.pro 中添加libwebp

  1. requires(qtHaveModule(gui))
  2.  
  3. load(configure)
  4. qtCompileTest(jasper)
  5. qtCompileTest(libmng)
  6. qtCompileTest(libtiff)
  7. qtCompileTest(libwebp)
  8.  
  9. load(qt_parts)

configure.prf 中把

  1. WEBKIT_CONFIG += \
  2. build_webkit1 \
  3. build_webkit2 \
  4. build_tests \
  5. $$WEBKIT_TOOLS_CONFIG

  改成

  1. WEBKIT_CONFIG += \
  2. build_webkit1 \
  3. build_tests \
  4. $$WEBKIT_TOOLS_CONFIG

  

不编译webkit2 , webkit2依赖Qt5V8,  提升HTML5 , js, qml 的支持. 并提升性能.

需不需要就看情况了

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

注意: 这三个文件的修改要在编译前.

qtwebkit\makefile是在.\makefile中编译module-qtwebkit时动态生成的(不存在才会生成)

所以如果修改三个文件后, 想重新编译, 需要删除webkit下新生成的所有makefile

  1. makefile
  2.  
  3. source\Makefile.api
  4. source\Makefile.api.Debug
  5. source\Makefile.api.Release
  6. source\Makefile.widgetsapi
  7. source\Makefile.widgetsapi.Debug
  8. source\Makefile.widgetsapi.Release
  9. source\Makefile.QtWebKit
  10.  
  11. source\JavaScriptCore\Makefile.jsc
  12. source\JavaScriptCore\Makefile.jsc.Debug
  13. source\JavaScriptCore\Makefile.jsc.Release
  14. source\JavaScriptCore\Makefile.LLIntOffsetsExtractor
  15. source\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Debug
  16. source\JavaScriptCore\Makefile.LLIntOffsetsExtractor.Release
  17. source\JavaScriptCore\Makefile.JavaScriptCore.DerivedSources
  18. source\JavaScriptCore\Makefile.JavaScriptCore
  19. Makefile.JavaScriptCore.Target
  20. Makefile.JavaScriptCore.Target.Debug
  21. Makefile.JavaScriptCore.Target.Release
  22.  
  23. Source\WebCore\Makefile.WebCore.DerivedSources
  24. Source\WebCore\Makefile.WebCore.Target
  25. Source\WebCore\Makefile.WebCore.Target.Debug
  26. Source\WebCore\Makefile.WebCore.Target.Release
  27. Source\WebCore\Makefile.WebCore
  28. Source\WebKit\Makefile.WebKit1
  29. Source\WebKit\Makefile.WebKit1.Debug
  30. Source\WebKit\Makefile.WebKit1.Release
  31. Source\WebKit2\Makefile.WebKit2.DerivedSources
  32. Source\WebKit2\Makefile.WebProcess
  33. Source\WebKit2\Makefile.WebProcess.Debug
  34. Source\WebKit2\Makefile.WebProcess.Release
  35. Source\WebKit2\Makefile.WebKit2.Target
  36. Source\WebKit2\Makefile.WebKit2.Target.Debug
  37. Source\WebKit2\Makefile.WebKit2.Target.Release
  38. Source\WebKit2\Makefile.WebKit2
  39. source\wtf\Makefile.WTF
  40. source\wtf\Makefile.WTF.Debug
  41. source\wtf\Makefile.WTF.Release
  42. Source\ThirdParty\ANGLE\Makefile.ANGLE.Target
  43. Source\ThirdParty\ANGLE\Makefile.ANGLE.Target.Debug
  44. Source\ThirdParty\ANGLE\Makefile.ANGLE.Target.Release
  45. Source\ThirdParty\ANGLE\Makefile.ANGLE
  46. Source\ThirdParty\ANGLE\Makefile.ANGLE.DerivedSources
  47. Source\WebKit\qt\declarative\Makefile.declarative.public
  48. Source\WebKit\qt\declarative\Makefile.declarative.public.Debug
  49. Source\WebKit\qt\declarative\Makefile.declarative.public.Release
  50. Source\WebKit\qt\declarative\Makefile.declarative
  51. Source\WebKit\qt\declarative\experimental\Makefile.declarative.experimental
  52. Source\WebKit\qt\declarative\experimental\Makefile.declarative.experimental.Debug
  53. 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

[Qt5] 减少dll依赖和大小(特别是webkit的大小和依赖)的更多相关文章

  1. echarts生成的图表大小怎么随屏幕的大小改变自适应

    最近在做图表,记录一下用到的知识点,当做自己的日记吧,会不断添加新内容 1,echarts生成的图表大小怎么随屏幕的大小改变自适应? this.chart.setOption(this.options ...

  2. 元素大小-偏移量(offset)客户区大小(client)滚动大小(scroll)

    一.偏移量---offset 1.定位父级 在理解偏移大小之前,首先要理解offsetParent.人们并没有把offsetParent翻译为偏移父级,而是翻译成定位父级,很大原因是offsetPar ...

  3. rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题

    rem在三星s5部分机型情况下 设置的字体大小与手机实际字体大小不一致问题 判断是特殊机型,做特殊处理. var u=navigator.userAgent; if($(window).width() ...

  4. qt5.11.2+vs2017环境下配置pcl1.8.1以及第三方依赖库vtk的编译

    1.准备工作 我所用的开发环境是win10下的qt5.11.2配置了vs2017的编译器,根据自己所用的VS的版本去官网下载对应版本的pcl库,如下 PCL-1.8.1-AllInOne-msvc20 ...

  5. ( 转 ) Android自绘字体大小paint.settextsize随分辨率大小变化

    1.获取当前设备的屏幕大小 DisplayMetrics displayMetrics = new DisplayMetrics(); this.getWindowManager().getDefau ...

  6. C#比较时间大小 1、比较时间大小的实验

    1.比较时间大小的实验    string st1="12:13"; string st2="14:14"; DateTime dt1=Convert.ToDa ...

  7. 实现图片大小的自动控制( 图片大小控制CSS代码)

    图片大小控制CSS代码 将以下代码放到你的样式表文件中即可实现图片大小的自动控制. /*图片大小控制CSS By Tekin */img,a img{border:0;margin:0;padding ...

  8. 蜗牛爱课 -- iOS 设置UIButton的字体的大小、显示位置、大小

    /设置按钮上的自体的大小 //[btn setFont: [UIFont systemFontSize: 14.0]];    //这种可以用来设置字体的大小,但是可能会在将来的SDK版本中去除改方法 ...

  9. 依赖注入及AOP简述(十二)——依赖注入对象的行为增强(AOP) .

    四.依赖注入对象的行为增强(AOP) 前面讲到,依赖注入框架的最鲜明的特点就是能够提供受容器管理的依赖对象,并且可以对对象提供行为增强(AOP)功能,所以这一章我们来讨论有关AOP的话题. 1.    ...

随机推荐

  1. 【原】Mongodb相关资料

    Mongodb与关系型数据库对比 Mongodb与关系型数据库对比 由于之前主要接触的是关系型数据库,所以主要将Mongodb与关系型数据库进行对比:主要从术语.Server与Client.数据定义语 ...

  2. C#插入排序详解

    这几天一直在研究算法,也算有点心得,现在跟大家分享一下,我是用C#做的 排序算法是想要成为大虾程序员必须要掌握的技术,它其实也是一种思想,你对算法熟悉,对以后编程有很大帮助 算法思路 ⒈ 从第一个元素 ...

  3. support vector regression与 kernel ridge regression

    前一篇,我们将SVM与logistic regression联系起来,这一次我们将SVM与ridge regression(之前的linear regression)联系起来. (一)kernel r ...

  4. JSON 省市数据包括港澳

    data: [{ name: "北京", cities: ["西城", "东城", "崇文", "宣武&quo ...

  5. [转]Ubuntu下GitHub的使用

    转自Pythoner 本文将对Ubuntu下Git的安装,以及如何连接GitHub进行讲解. 1.环境 OS: Ubuntu13.04 64bitsGit: 1.8.1.2 2.Git安装 执行如下命 ...

  6. 内核参数优化/etc/sysctl.conf

    net.nf_conntrack_max = 65536000net.netfilter.nf_conntrack_tcp_timeout_established = 1200net.ipv4.tcp ...

  7. work3

    HOMEWORK-03 红字部分为组员修改的意见 文件介绍 在EXE文件夹中的main.exe文件为本项目执行文件直接点击即可,CODE文件夹中的C文件夹中包含了算法部分的代码,其编译出的DLL文件在 ...

  8. AutoCAD.NET二次开发:扩展数据之XData

    结果缓存——ResultBuffer 结果缓存即 Autodesk.AutoCAD.DatabaseServices.ResultBuffer 类型,使用 ResultBuffer 对象时需要提供一个 ...

  9. java 字符串String操作工具类

    /** * StrKit. */ public class StrKit { /** * 首字母变小写 */ public static String firstCharToLowerCase(Str ...

  10. 一款多浏览器兼容的javascript多级下拉菜单

    这个多级下拉菜单的脚本大小不到2K,带有动画效果,可以方便地支持多个实例,并且能良好兼容WordPress系统wp_list_cats和wp_list_pages生成的多级列表.要初始化一个菜单,只需 ...