对于经常发布桌面应用程序的攻城狮而言,当然希望自己的程序只要一个可执行文件,拷贝到任何位置直接双击就能运行啦。比如笔者,经常使用MSYS2 里的mingw64 Qt静态编译程序,以便只要一个可执行文件就能到处运行。

以前,我用MFC静态编译很香。换成Qt后,感觉静态编译出来的程序,体积出乎意料的大,有的一个EXE文件就有20MB。虽然比起一个APP动辄200MB起步而言,PC上的exe有20MB也不算啥,但对从DOS时代 长城PC 286 1.2MB软盘走来的我,还是觉得有些膈应。

解决的办法是使用压缩加壳工具,UPX,配合lzma开关,能轻松达到20%以下的压缩比。

1 安装UPX

在msys2环境下,运行

pacman -S upx

而后,执行upx,看到输出就可以了。

$ upxUltimate Packer for eXecutablesCopyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..Commands:-1     compress faster                   -9    compress better-d     decompress                        -l    list compressed file-t     test compressed file              -V    display version number-h     give more help                    -L    display software license
Options:-q     be quiet                          -v    be verbose-oFILE write output to 'FILE'-f     force compression of suspicious files-k     keep backup files
file..   executables to (de)compressType 'upx --help' for more detailed help.UPX comes with ABSOLUTELY NO WARRANTY; for details visit https://upx.github.io

2 压缩单个文件进行测试

我们选取一个比较极端的文件,就是taskbus软件无线电平台的发行版,单个exe文件有40MB,我们执行命令:

$ upx  --lzma  --overlay=strip taskBusPlatform.exe

输出:

                       Ultimate Packer for eXecutablesCopyright (C) 1996 - 2020
UPX 3.96        Markus Oberhumer, Laszlo Molnar & John Reiser   Jan 23rd 2020File size         Ratio      Format      Name--------------------   ------   -----------   -----------42947762 ->   7836672   18.25%    win64/pe     taskBusPlatform.exePacked 1 file.

可以看见,直接压缩为7MB左右。参数说明:

  1. lzma选项选取的是lzma压缩算法,速度还可以,压缩率默认比较高。
  2. –overlay=strip :指的是对PE中的叠加数据进行剥离,可能会影响到一些附带自定义数据的程序的运行。如果压缩后程序不能用,则去掉这个选项。

3 批量压缩二进制文件

对发布文件夹下的所有程序、DLL进行压缩.

$ find  . -type f -name "*.exe" -exec upx  --lzma --force --overlay=strip {} \;
$ find  . -type f -name "*.dll" -exec upx  --lzma --force --overlay=strip {} \;

参数说明:
–force 是忽略警告强行压缩。

压缩后,发行包的体积大大减少了。

4 注意事项

要仔细测试压缩后的程序。一些含有资源的EXE,要看看图标、声音还在不在了。如果图标和声音都还在,那就问题不大。如本例子,下图显示正常,图标都在。

另外,对于当代的硬盘空间而言,可执行文件体积并不是问题。所以,通过7z整体压缩绿色软件,也是更为安全的方法。这种加壳的二进制文件,再次用7z压缩,效果就很差啦。所以,如果是单纯为了节约带宽,建议用7z压缩发布包即可。

使用MSYS2和UPX显著缩小发布文件体积相关推荐

  1. ttf字体包瘦身,ttf字体包提取指定字体,缩小ttf文件体积。

    ttf字体包瘦身 注:此方法只试用于只需要少数字体的情况. 需求 做APP时出现了一个需求,应用登录页面和主页面的系统名称需要根据用户所属行政区划进行动态调节. 为了突出系统名和样式的美观,系统名在显 ...

  2. 怎样减小图片的体积?教你一招缩小图片文件体积

    现在许多行业的人们都会使用到大量的图片,有些图片体积过大又不能删除就会占用我们的存储空间,那么我们应该怎么压缩图片(https://www.yasuotu.com/jpg)的体积呢?接下来,小编为大家 ...

  3. 发布 .NET 5 带运行时单文件应用时优化文件体积的方法

    自 .NET 发布起,.NET Framework 运行环境就是其摆脱不掉的桎梏.后来有了 .NET Core ,微软终于将自带运行时和单文件程序带给了我们.即便如此,大部分情况下开发者仍然不太满意: ...

  4. C# 极限压缩 dotnet core 控制台发布文件

    每次发布 dotnet core 应用都会觉得发布文件太大,而如果使用极限压缩,用 CoreRT 能让发布的控制台文件到 5KB 左右,不需要带框架就能在其他设备运行 这是微软 MichalStreh ...

  5. asp.net core 发布到 docker 容器时文件体积过大及服务端口的配置疑问

    在 asp.net core 发布时,本人先后产生了3个疑问. 1.发布的程序为什么不能在docker容器中运行 当时在window开发环境中发布后,dotnet xxx.dll可以正常运行:但放入d ...

  6. 放大、缩小chm文件字体的方法

    原文章地址: 放大.缩小chm文件字体的方法  http://blog.sina.com.cn/s/blog_6df127760102v4cq.html 原文内容: 问题: 我们经常阅读chm格式的电 ...

  7. Vue 发布文件压缩

    介绍 compression-webpack-plugin它是一个Vue发布文件的压缩算法.针对Vue打包的文件过大,首屏加载过慢,通过compression-webpack-plugin生成指定的. ...

  8. python函数和模块有什么关键特性_零基础学python之函数与模块(附详细的代码和安装发布文件过程)...

    代码重用--函数与模块 摘要:构建函数,创建模块,安装发布文件,安装pytest和PEP 8插件,确认PEP8兼容性以及纠错 重用代码是构建一个可维护系统的关键. 代码组是Python中对块的叫法. ...

  9. 苹果电脑如何缩小pdf文件的容量大小?电脑上怎么把pdf文件容量缩小?

    苹果电脑如何缩小pdf文件的容量大小?无论是什么文件,一旦文件体积过大就会很麻烦.比如一份PDF文件比较大,传输就会很麻烦.今天分享一个缩小pdf容量的简单方法,苹果电脑mac系统也可以使用: 搜索一 ...

最新文章

  1. 浅谈批处理获取管理员运行权限的几种方法
  2. wince系统改安卓系统_什么是实时操作系统(RTOS)
  3. python与excel表格-如何用python处理excel表格
  4. WIFI搜索的到别人,却找不到自己家的wifi
  5. jq的链式调用.end();
  6. 谷歌浏览器不能安装离线插件——可行方法
  7. 第十节(this关键字 static关键字)
  8. 用深度学习进行语音识别为什么还要算mfcc?
  9. paip.提升性能----java 无锁结构(CAS, Atomic, Threadlocal, volatile, 函数式编码, 不变对象)
  10. java读取配置文件的详细写法,Properties配置文件读取相关java知识
  11. sonar pmd\p3c插件源码初步解析
  12. SCTF | 三足鼎立焦点对抗,天枢战队有惊无险斩获冠军头衔
  13. 前端---div 显示与隐藏
  14. rtx2060什么水平_rtx2060性能怎么样
  15. 解决 no such file or directory, scandir ‘node_modules\node-sass\vendor 报错
  16. selenium wedriver镜像地址
  17. python-python爬取豆果网(菜谱信息)
  18. 第二十二天:期末考前整理的20条好句子
  19. 使用谷歌的服务器训练
  20. 033_SS_Inversion-Based Creativity Transfer with Diffusion Models

热门文章

  1. python六种基本数据类型
  2. 【单片机毕业设计】基于单片机的空气质量(天然气、CO、甲醛、甲苯、TVOC、CO2)检测系统的设计
  3. 共创·共享·共赢 2020重庆市建筑材料协会行业交流会圆满举行
  4. 创领智行 - 德赛西威面向产业变革的新思考和展望
  5. 串联谐振和并联谐振有什么区别?分别有什么特点?
  6. 【Nacos】Nacos配置中心的使用与SpringCloud整合
  7. Pygame 外星人入侵(10)计分板
  8. linux系统 JDK11安装
  9. 基于backtrader的唐奇安通道策略实现
  10. C1071: 在注释中遇到意外的文件结束