十年前学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. 将NSTimer加入至RunLoop中的两种方法差别

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launc ...

  2. Android中关于JNI 的学习(零)简单的样例,简单地入门

    Android中JNI的作用,就是让Java可以去调用由C/C++实现的代码,为了实现这个功能.须要用到Anrdoid提供的NDK工具包,在这里不讲怎样配置了,好麻烦,配置了好久. . . 本质上,J ...

  3. 3.第一个Node.js程序:Hello World!

    转自:http://www.runoob.com/nodejs/nodejs-tutorial.html 以下是我们的第一个Node.js程序: console.log("Hello Wor ...

  4. 简约之美jodd--props属性使用

    Prop是一个超级properties:包含了很多jdk缺失的东西:utf-8支持,宏,分区,profiles,全配置等等. 属性存储在一个或者多个*.props文件,而且它是开放的,支持多种类型的资 ...

  5. JavaScript--数据结构与算法之排序

    排序总结————常见的排序 常见的9中排序(冒泡,选择,插入(二分插入,希尔),归并,快速,堆,计数,基数,桶排序)可分为两类 比较排序:冒泡,选择,插入(二分插入,希尔),归并,堆,快速 非比较排序 ...

  6. 深入理解HTTP协议及原理分析之缓存(3种缓存机制)

    3.2 缓存的实现原理 3.2.1什么是Web缓存 WEB缓存(cache)位于Web服务器和客户端之间. 缓存会根据请求保存输出内容的副本,例如html页面,图片,文件,当下一个请求来到的时候:如果 ...

  7. 洛谷 P3131 [USACO16JAN]子共七Subsequences Summing to Sevens

    P3131 [USACO16JAN]子共七Subsequences Summing to Sevens 题目描述 Farmer John's NN cows are standing in a row ...

  8. 解决Keystore was tampered with, or password was incorrect

    使用签名文件keystore查看生成的数字签名中报错解决 Keystore was tampered with, or password was incorrect 这是由于android规定自己定义 ...

  9. 常用的织梦dedecms安全设置集合整理

    织梦系统用户很多,被发现的漏洞也就相对很多,所以网站安全需要做好,很多所谓的“黑客”都是用工具来扫描入侵,厉害点的人是不屑来黑我们的小网站的,所以在我们不是专业维护人员情况下,做好一般的安全防护就可以 ...

  10. windows下安装cmake

    windows下安装cmake 下载地址 download -> cmake-3.12.0-rc2-win64-x64.msi 安装 验证cmake --version