十年前学C++的时候,无聊到把windows 文件夹下几乎所有的*.dll 都看过一遍。偶尔在程序运行时看到缺少 *.dll 的提示,都会直接找出来解决。

随着“开发平台”和“编译器”版本的逐年升级,一个程序的依赖链接库体积也越来越大,这给码农、程序猿、软件攻城狮们测试和发布都造成了比较大的麻烦!

六年前做过某专业软件汉化包的安装程序打包,感觉专业的安装程序制作工具对一些小程序来说太浪费了,而且用户会觉得不够“绿色”。如果能够简单的完成打包,并满足基本要求,那是比较好的解决方案。

前段时间有不少人都问到我“用什么软件做上位机GUI比较好?”,最近看了两天Qt,就拿这个说事吧。

Qt,是一个1991年由奇趣科技开发的跨平台C++图形用户界面应用程序开发框架。和Java的“一次编译,到处运行”所不同的是,Qt是源代码级的跨平台,具有“一次编写,到处编译”的特性。Google Earth、Skype、Opera……很多软件都是基于Qt编写的。

目前最新版本是 5.1.1,由于前段时间玩linux 的编译上瘾了,也懒得去装MS Virual Studio2010/2012,于是下载了qt-windows-opensource-5.1.1-mingw48_opengl-x86-offline.exe(集成mingw4.8、opengl)。

一、    软件环境安装与设置

5.1.1 版本在windows平台的移植和集成进一步完善了,不需要像网上那些针对旧版本的教程中说的需要繁琐的设置。只需要像典型的windows安装程序一样鼠标点击即可完成安装(当然在安装中要注意的是:mingw 默认并未选中)。

这个是能够持续看上两天Qt的主要原因!!!

二、    项目设置与程序编译

这个看看教程就行了,只是5.1.1 的教程暂时还没有出现!

随便找了个经典的“Hello world!”来跑了一下,有惊无险的“构建成功”。

PS:和所有英文软件一样,项目路径里不要有中文、日文、韩文、火星文等等说英语的家伙不认识的符号!

又PS:不要认为别人编译通过的程序就一定能编译成功,编译环境和软件升级中的更新都可能导致失败!

三、    程序发布

程序编译的时候默认是“debug”的,其实和“release”生成的exe 都差不多,只是依赖链接库的大小不一样。对于普通用户,其实对程序大小是不敏感的,更多的人会关心华丽的人机界面或者繁杂的功能。只有要求苛刻的嵌入式系统用户和有强迫症的码农、程序猿、软件攻城狮们会追求极限的压缩体积!

四、    程序打包

要求苛刻的嵌入式系统用户有时候宁愿舍弃新的功能,都会要求稳定可靠的应用,而版本升级有时候并没有软件开发商的广告说的那么美好。

eg:随便下了个“串口调试助手”来做Model。

Qt4编译这个“串口调试助手”,生成的依赖链接库只有4个,文件大小都还能够接受;

换成Qt5 来编译,会发现一下多了很多东西出来!


即使是用压缩工具压缩打包以后( 
)的体积,仍然比未压缩的旧版本要大!


一个小工具(一个mingw编译的Qt gui程序),依赖的DLL实在是太多,着实有点不太方便。而在社区里更多人提到的都是“静态编译”,但是使用“静态编译”又会受到开源许可的一些限制。

现在该是我们的小伙伴“Enigma Virtual Box”表现的时候了!!!

五、    打包依赖链接库

EnigmaVirtual Box 最新版本是 6.80 Build 20131003,启动后如下图所示:


在“Enter Input File Name”一栏指定Qt编译生成的 *.exe 文件,同时在“EnterOutput File Name”一栏会自动生成打包后输出文件的路径和文件名称。(请无视中间的广告!)

点击左下方的“Add…”按钮,添加所有的依赖链接库文件;然后点击右下方的“FilesOptions”,在弹出的对话框里选中“Enable Files Virtualization”和“CompressFiles”两项;“OK”后返回点击“Process”并等待小伙伴干完该干的活。


小伙伴生成的*.exe 文件(18.247KB )的尺寸要小了很多,并且这是一个纯粹的“绿色软件”,直接复制就能在任何存储介质上运行了!有了这个,妈妈再也不用担心系统会突然弹个框框出来,提示缺少××.dll 文件了!

六、    Qt5 主要依赖链接库说明

1.QT模块库

1

2

3

4

Qt5Core.dll      #QT核心库

Qt5Gui.dll       #QT Gui库

Qt5Widgets.dll   #QT Widgets库,QT 5中GUI程序基本都需要此dll

#还有其他程序用到的Qt5XXX.dll

2.ICU依赖库

(International Component for Unicode,Unicode工具)

1

2

3

icudt51.dll

icuin51.dll

icuuc51.dll

3.QT插件库(新增库,路径必须正确)

1

2

3

4

5

6

# 根据不同的程序,需要不同的插件库

#例如 QT_DIR/plugins/*/*.dll

# 需要将 platforms/*.dll,accessible/*.dll的文件结构保留

# 放在你所编译的程序所在目录

plugins/platforms/qwindows.dll

plugins/accessible/qtaccessiblewidgets.dll

4.EGL依赖库,为OpenGL,OpenGL es提供接口

1

2

libEGL.dll

libGLESv2.dll

5.mingw依赖库(msvc编译则无需这些库)

1

2

3

libgcc_s_dw2-1.dll

libstdc++-6.dll

libwinpthread-1.dll

6.VC运行库(mingw编译则无需这些库)

1

2

msvcr110.dll(对应VS2012)

msvcp110.dll

 

最后,让新的小伙伴 Qt5 给我打个招呼,得瑟一下!

Qt5 编译 & 打包依赖dll发布的更多相关文章

  1. 将Qt 动态链接生成的exe及依赖dll打包方法

    源地址:http://blog.csdn.net/ztz0223/article/details/8939341 将Qt 动态链接生成的exe及依赖dll打包方法 原文:http://www.qtcn ...

  2. Qt--将Qt 动态链接生成的exe及依赖dll打包方法

    Qt静态编译链接生成的exe文件,不需依赖dll,可以独立运行,发布很方便. 但绝大多数用的都是Qt开源版本,如果用静态链接,会有些限制. 方法之一,就是用动态编译,然后把exe和需要的dll整合成一 ...

  3. Ant自动编译打包&发布 android项目

    Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Eclipse手动打包各种渠道包就有点不切实际了,这时候我们用到Ant帮我们自动编译打包了. ...

  4. 关于windows下c++生成的exe发布时的依赖dll问题

    如同linux下通常要求安装特定版本的libstdc++一样,windows下vc++生成的exe发布时的依赖dll问题,可以参见帖子,http://bbs.csdn.net/topics/39105 ...

  5. Andorid进阶7—— Ant自动编译打包&发布 android项目

    http://www.cnblogs.com/tt_mc/p/3891546.html Eclipse用起来虽然方便,但是编译打包android项目还是比较慢,尤其将应用打包发布到各个渠道时,用Ecl ...

  6. shell的运用 : jenkins 编译 打包前端发布 生产(tomcat)

    生产隔离做得非常.....文件上传只能通过固定ip机器的sftp账户上传,账户密码每个月要写申请才能获得. 登陆生产服务只能通过浏览器登陆!!! 发布一次生产,很痛苦. 做了简单的shell来减轻痛苦 ...

  7. Angular入门到精通系列教程(14)- Angular 编译打包 & Docker发布

    目录 1. 概要 2. 编译打包 2.1. 基本打包命令 2.2. 打包部署到二级目录 3. Angular站点的发布 3.1. web服务器发布 3.2. 使用docker发布 4. 总结 环境: ...

  8. 通过ant脚本编译打包android工程

    通过ant脚本,编译打包android工程 1.Android程序编译.打包.签名.发布的三种方式:  方式一:命令行手动编译打包  方式二:使用ant自动编译打包  方式三:使用eclipse+AD ...

  9. 走进JavaWeb技术世界12:从手动编译打包到项目构建工具Maven

    小李的Build之路(上) 转自: 刘欣 码农翻身 2016-07-10 摘要:手工Build的烦恼要不是为了和女朋友留在一个城市,小李肯定去北上广奋斗去了.现在他只能留在这个2.5线城市,进入这家软 ...

随机推荐

  1. MSSQL相关用法

    一.分页查询 方式一(row_number): SELECT TOP pageSize * FROM (SELECT row_number() OVER (ORDER BY orderColumn) ...

  2. 一句话解决Ping问题(主机,开发板,虚拟机)

    PC机使用网卡A连接开发板,VMWare就要使用同一个网卡A作为桥接网卡 步骤: 1.确定网卡A 2.VMWare选择网卡A作为桥接网卡 3.设置三者IP在同一网段 a.Windows网卡A的IP b ...

  3. 洛谷 P2655 2038年问题

    P2655 2038年问题 题目描述 网络时代,机会与危机共存.“千年虫”解决之后,会不会有新的“虫”出现?回答是肯定的,“2038年”就是一个新的关卡. 也许大家都已经知道计算机的2000年问题是什 ...

  4. C++ 学习路线推荐

        相信有非常大一部分学计算机的童鞋都是靠自学,即使本身是计算机专业的同学,也会认为只通过课堂上的学习是远远不够的,并且在上课时所用到的教材也不够好.然而自学的时候有个非常大的问题就是找不到合适的 ...

  5. poi完美word转html(表格、图片、样式)

    直入正题,需求为页面预览word文档,用的是poi3.8,以下代码支持表格.图片,不支持分页,只支持doc,不支持docx: /** * */ import java.io.BufferedWrite ...

  6. 1.1selenium 介绍

    1.1selenium 介绍selenium 是一个 web 的自动化测试工具,不少学习功能自动化的同学开始首选 selenium , 相因为它相比 QTP 有诸多有点:* 免费,也不用再为破解 QT ...

  7. [RxJS] Avoid mulit post requests by using shareReplay()

    With the shareReplay operator in place, we would no longer fall into the situation where we have acc ...

  8. Stable Matching (Gale Sharpley Algorithm)

    稳定婚配问题:n个男生n个女生.当中每一个人都有自己心仪的列表. 问怎样达成稳定的匹配(比方, b想B求婚,可是B已有的对象的优先级高于b,此时b的魅力不足以拆散B所处的那一对,即达到稳定状态.) ( ...

  9. amazeui学习笔记--css(布局相关1)--网格Grid

    amazeui学习笔记--css(布局相关1)--网格Grid 一.总结 基本使用 1.div+class布局:amaze里面采取的就是div+class的布局方式  <div class=&q ...

  10. 基于深度学习的目标检测(object detection)—— rcnn、fast-rcnn、faster-rcnn

    模型和方法: 在深度学习求解目标检测问题之前的主流 detection 方法是,DPM(Deformable parts models), 度量与评价: mAP:mean Average Precis ...