在网上,有好多绿色软件,不仅功能强大,而且软件本身的体积非常小。有的通常只在几十K左右。那他们是怎么做到把软件做的怎么小的呢?
    
先看一个最典型的程序:
#include
int main()
{
printf("Hello, World!\n");
return 0;
}

上面的程序之所以被称之为典型,是因为他有如下的内容:
1、系统函数调用:printf
2、有静态数据段

好,现在把此文件放到VisualStudio6.0中进行编译,看看文件有多大。
1、用VisualStudio6.0打开HelloWorld.cpp文件,直接按F7。然后点击OK,生成Project文件,然后进行编译。编译完成了以后,看看Debug目录下的执行文件的大小,为172,096Bytes。

2、刚才编译的Debug文件,现在修改成Release文件看看。选择Win32 Release,再编译。察看执行文件大小,现在成了40,960Bytes。看来Debug版本的要比Release的小。

3、检查代码优化:发现执行文件的优化是Maximize Speed。那么修改成MinimizeSize看看。重新编译,得到执行文件的大小为:40,960Bytes。看来大小没什么变化。其实这是由于我们的代码本身太小的缘故,导致即使变化了也看不出来。

4、想想我们程序的main函数是由CRT类库进行引导的。在我们现在的设定当中,由于采取的是系统缺省的编译连接方式(缺省为编译为Single Thread,StaticLibrary),所以,在我们的执行文件当中,包含了CRT的二进制代码。好,修改编译选项:C/C++ => Category:Code Generation => Use run-time
library:MutiThreaded Dll。编译看看:执行文件大小变成了16,384Bytes。

5、刚才的设定确实不错,一下子把执行文件大小减小到了16K。现在用UltraEdit看看执行文件都是些什么内容。结果大吃一惊:基本上都是0。看来这个有减小的必要了。都知道,执行文件都有自己的代码段,数据段等等,每个段的大小也是采用编译器缺省设定的。好,我们来修改一下段的大小看看:
5.1 连接选项中有一个是/opt:nowin98,意思是将段的大小设定成为Win2000适应的。编译看看:哇塞,变成了2,560byte。看来这个选项确实把文件变小了N多。
5.2 在查察连接选项中还有没有什么特别的。发现/align:xx还可以将段大小缩小。通过UltraEdit察看刚才/opt:nowin98编译出来的文件,发现每个段的大小都是4K的整数倍。看来/align:xx还有减小的趋势。试一把再说:添加连接选项:/align:16(这个大小已经是能够设定的最小的了)。看看结果:1,408Bytes。厉害,现在代码更小了。
5.3 现在回想起来,执行文件大小有数据段,执行代码段等等,如果把这些段都合并起来,是不是就会把段之间的冗余有减小了呢?再试试看:添加选项:/merge:.data=.text /merge:.rdata=.text。再看看文件大小:1,328bytes。真的很不错了。

6、刚才的设定确实不错,似乎达到了我们想要的极限了。但是回头想一下,如果没有CRT库的话,会不会更小了?实际上确实这样。添加连接选项: /entry:main,把入口地址直接指向我们的main函数看看。得到592Bytes。

最终我们得到我们最后的大小592Bytes了。我想这也许是我们通过编译器能够编译出来的最小的代码了。

结论:
通过上述的步骤,我们了解了如何修改那些编译连接选项来达到执行文件瘦身的目的。但是,通常来讲,在我们的Release文件当中,并不需要如此小的执行文件。如果想达到瘦身的目的,修改为library:MutiThreaded Dll和添加/opt:nowin98已经是很好的选择了。其他别的选项在编译的时候或多或少的有警告出现,而且,带有那些编译选项编出来的执行文件也不一定在各个平台上能够适用。

另外:如果你的执行文件即使通过了这些设定还是比较大的话,也可以通过一些EXE文件压缩工具来进行压缩。比如UPX等等。在此不再细

如何最小编译你的软件相关推荐

  1. CentOS 7 使用源代码编译并安装软件

    CentOS 7 使用源代码编译并安装软件 1. 确保有编译开发环境 # yum group list 看看是否有 Development Tools 没有的话需要安装 # yum group ins ...

  2. 怎么卸载用 make install 编译安装的软件?

    在linux 中用 ./configure && make && make install 后,如果想删除这个软件我应该怎么删除呢? 好像有一个叫"make ...

  3. 64位Linux上编译32位软件

    问题:我的软件是运行在32位环境下的,原来也是在CentOS 6.3 32位上编译,运行都是没有问题的: 最近CentOS 7出来了,但是只有x86_64的,我的任务就是将我的软件移植到64位的Cen ...

  4. 观点|通过短生命周期和最小权限原则保护软件供应链安全

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 专栏·供应链安全 数字化时代,软件无处不在.软件如同社会中的"虚拟人",已经成为支撑社会正常运转的最基本元素之一,软件的安全 ...

  5. linux 源码编译upx 压缩软件

    UPX(the Ultimate Packer for eXecutables)是一个非常全面的可执行文件压缩软件,支持dos/exe.dos/com.dos/sys.djgpp2/coff. wat ...

  6. 添加编译宏_软件开发——编译链接

    对于平常的应用程序开发,我们很少需要关注编译和链接过程.我们平常Xcode开发就是集成的的开发环境(IDE),这样的IDE一般都将编译和链接的过程一步完成,通常将这种编译和链接合并在一起的过程称为构建 ...

  7. 程序编译过程与软件启动过程

    一.      软件执行流程 1. 软件编译流程 Ø  预编译完成宏展开工作. Ø  为每一个.cxx源文件编译一个目标文件(.obj,.o),目标文件中至少包含二进制的代码段和数据段.在cxx源文件 ...

  8. 卸载 make install 编译安装的软件

    方法一: build目录下,执行: make unistall make的原理是执行Makefile文件里的指令,make的基本用处是自动根据makefile里的指令来编译源文件.它还可以用来做比如安 ...

  9. 在c语言中 程序的最小编译单位是,C语言课堂练习习题集

    <C语言程序设计>自主学习检验题汇编 第一.二章 C程序与算法 单项选择题 1. 将汇编语言编写的程序翻译成目标程序的程序是() A)解释 B)编译 C)汇编 D)目标 2. 不属于面向机 ...

最新文章

  1. gcc s.lds 使用方法
  2. pip命令提示unknown or unsupported command 'install'——python3.7安装PyInstaller经验
  3. Jmeter调用自定义jar包
  4. 华为OJ系列之---表示数字
  5. java web.xml_Java Web之XML基础
  6. 单机多节点有意义吗_十行代码让你的单机“影分身”,分布式训练速度快到飞起...
  7. 上一局APP玩边画边猜,第1次见人使用道具,我的游戏体验上升了
  8. .net mvc 超过了最大请求长度 限制文件上传大小
  9. Android官方开发文档Training系列课程中文版:手势处理之多点触控处理
  10. 熬了几个大夜,学完一套985博士总结的Pytorch学习笔记(20G高清/PPT/代码)
  11. linux镜像 百度网盘链接
  12. c语言交通处罚管理系统刘,交通处罚单管理系统(C程序设计)修改版
  13. 百度地图api自定义marker图片不显示问题
  14. 王阳明:一个人不开心的真正原因:智慧不够
  15. android air flash,FlashAir
  16. Form表单的重置按钮(type=“reset“)无法重置隐藏Input输入框的值
  17. DAO 的具体内涵与概念
  18. maven编译报错java -source,pom设置maven.compiler.source原理
  19. java中ajax是什么意思,java中使用Ajax技术
  20. 骨传导有没有副作用?骨传导耳机有什么优点吗?

热门文章

  1. (蓝桥杯)Sine之舞
  2. 笔记本 电池换电芯 详解
  3. 伯明翰计算机科学研究生2020,2020年伯明翰大学计算机科学硕士专业硕士申请条件-学费-世界排名...
  4. 【黄敏聪|自由设计师系列1-基础篇】教程之二 |自由设计师走向成功最佳策略是什么?
  5. 使用Java 编写将阿拉伯数字转为中文数字的代码
  6. SEM——搜索引擎营销
  7. 「SymPy」符号运算(1) 简介/符号/变量/函数/表达式/等式/不等式/运算符
  8. 如何把视频放进图片指定区域的剪辑技巧
  9. 鼠标点击器20+版本使用教程系列(1)单位置点击器
  10. 图形学领域的关键算法及源码链接