绑定 UPX 显著减少 Qt 生成文件体积。顺便散分。Merry Chrismas!

dext 2011-12-15 05:46:50
加精
UPX 是著名的 开源 可执行文件压缩工具,可以压缩 Linux, Win32, MacOS, DOS... 等系统下的可执行文件体积。
压缩后文件还是可执行的。

论坛里有很多人说,Qt生成的文件体积太大,所以 UPX可以帮大忙。如何 自动化的完成这个压缩过程呢?
这里仅以 Windows 下的 mingw32 为例。 有兴趣的朋友可以 推而广之。

首先 下载 刚刚更新的UPX http://upx.sourceforge.net/download/upx308w.zip
解压缩后,只有 upx.exe 是有用的,可以将它放在 mingw32\bin 或 windows\system32 下,省去设置路径的烦恼

然后 在你的 pro 文件 中的最后加上这么一句。
Release:QMAKE_POST_LINK += upx -9 $(DESTDIR_TARGET)

这句表明,在 编译后,会自动执行 upx -9 $(DESTDIR_TARGET)
-9 的意思是,最大压缩率。
前面的Release 只针对 release 版本有效。因为Debug版本 被压缩后 会丢失调试信息。

这个对DLL 同样有效。所以就放心的加吧。

当然,你也可以加在 Qt\mkspecs\win32-g++\qmake.conf 里,这样 以后所有的 工程就自动 被压缩了。
UPX可以将Qt可执行文件压缩为 原来的 40%大小,还是很诱人的。
...全文
3133 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
念茜 2011-12-27
  • 打赏
  • 举报
回复
[Quote=引用 41 楼 zzz_ss654321 的回复:]

大家注意一下, UPX 压缩的东东, 现在很多杀毒软件都认为是病毒哦.
现在这些杀毒软件真恶心人哪.
[/Quote]

唉……
javaweb_research 2011-12-27
  • 打赏
  • 举报
回复
是啊 这是个严重问题 [Quote=引用 41 楼 zzz_ss654321 的回复:]

大家注意一下, UPX 压缩的东东, 现在很多杀毒软件都认为是病毒哦.
现在这些杀毒软件真恶心人哪.
[/Quote]
zzz_ss654321 2011-12-22
  • 打赏
  • 举报
回复
大家注意一下, UPX 压缩的东东, 现在很多杀毒软件都认为是病毒哦.
现在这些杀毒软件真恶心人哪.
wjlazio 2011-12-19
  • 打赏
  • 举报
回复
不错,学习了。。。。
noodle123 2011-12-19
  • 打赏
  • 举报
回复
确实应该静态编译一下试试。
glacieret 2011-12-18
  • 打赏
  • 举报
回复
在Windows 平台下,不同的程序加载相同的DLL,这个DLL在内存中只有一份拷贝,所有的程序对应的都是这一份拷贝(除非某一个程序对DLL进行了写操作,这时会为这个程序复制一份这个DLL的内存供其单独使用)
UPX 压缩后DLL会失去这一特性,所有使用该DLL的程序都会有这个DLL的一份独立内存拷贝
(这才是其浪费内存的原因)
因此,如果DLL仅有一个程序使用就无所谓,否则的话就要权衡一下了
Reverse.King 2011-12-18
  • 打赏
  • 举报
回复
如果纯粹为了发布减小体积用7z,zip之类的压缩工具更简单。
Reverse.King 2011-12-18
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yiyaaixuexi 的回复:]

我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么
[/Quote]
消耗CPU,瞬时RAM
蓝色啄木鸟 2011-12-17
  • 打赏
  • 举报
回复
qt4.7.3,使用upx能使10M+的qtgui4.dll、qtcore4.dll压缩到4M。但是内存占用相应的牺牲好几M。基本上,用牺牲内存占用,换取硬盘占用不值得。在发布时,用nsis打包,最小也能压缩到4M
念茜 2011-12-17
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 loaden 的回复:]

引用 23 楼 yiyaaixuexi 的回复:
我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么

编译一个静态版本的EXE,再用UPX压缩看看就知道了。
动态的不明显,因为EXE太小了。

我曾经做过一个简单的测试:
http://topic.csdn.net/u/20100121/17/99208b1a-ae17……
[/Quote]

感谢老邓 我豁然开朗了!
这个的确需要根据情况、需求 选择使用。
念茜 2011-12-16
  • 打赏
  • 举报
回复
我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么
念茜 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 dext 的回复:]

UCL has been designed to be simple enough that a decompressor can be implemented in just a few hundred bytes of code. UCL requires no additional memory to be allocated for decompression, a considerab……
[/Quote]

确实, 需要更正一直以来的错误理解.
通过 UPX 压缩过的程序和程序库完全没有功能损失和压缩之前一样可正常地运行,对于支持的大多数格式没有运行时间或内存的不利后果。
tczzjin 2011-12-16
  • 打赏
  • 举报
回复
对于EXE文件.非常建议使用upx进行压缩.而对于qt本身的dll包.文件较大一般是分发比较困难.可以使用最高强度的lzma压缩最终整个程序文件夹形成一个压缩包.而不是对dll文件本身压缩.这样用户解压之后得到还是原始的dll文件也可以显著的减小网络的程序大小
老邓 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 xunxun1982 的回复:]
不要对dll/so使用,这样会频繁调用解压缩器(如果内存中没有的话)
[/Quote]
只要不是动态加载、释放,应该不会出现频繁调用解压缩器的情况。
DLL只应该加载一次到内存:我们的Qt程序会一直到运行结束,才会释放相应DLL的。
所以理论上,应该和EXE一样:只解压一次。
xunxun 2011-12-16
  • 打赏
  • 举报
回复
UCL算法自然不消耗内存,但是后来UPX改成LZMA了,后者的解压缩都会消耗一定的内存而且速度较慢,除非你们把他禁用掉

而解压缩又有两种处理,对于资源紧张系统,他不会解压到内存而是寄存文件,这样增加了IO的消耗,即使UCL的解压缩器也是如此
xunxun 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 28 楼 loaden 的回复:]

引用 23 楼 yiyaaixuexi 的回复:
我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么

编译一个静态版本的EXE,再用UPX压缩看看就知道了。
动态的不明显,因为EXE太小了。

我曾经做过一个简单的测试:
http://topic.csdn.net/u/20100121/17/99208b1a-ae17……
[/Quote]

对,所以也只建议对较小的exe使用

不要对dll/so使用,这样会频繁调用解压缩器(如果内存中没有的话)
老邓 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yiyaaixuexi 的回复:]
我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么
[/Quote]
编译一个静态版本的EXE,再用UPX压缩看看就知道了。
动态的不明显,因为EXE太小了。

我曾经做过一个简单的测试:
http://topic.csdn.net/u/20100121/17/99208b1a-ae17-4a3f-a03c-cb432699e78c.html
wine12 2011-12-16
  • 打赏
  • 举报
回复
只接分来了,O(∩_∩)O哈哈哈~
sourire_will 2011-12-16
  • 打赏
  • 举报
回复
感谢分享
ancheel 2011-12-16
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yiyaaixuexi 的回复:]

我在嵌入式Linux上试了一下,应用程序的确小了40%,而且启动消耗内存无大差异,我不理解的是,消耗的代价是什么
[/Quote]

可能是启动速度吧。

另外,那几个DLL,打包以后在安装包里占用的空间也就5M左右,只是安装解压后占用十几M空间。
加载更多回复(14)

16,173

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧