如何实现较小的可执行文件?

Pet*_*háč 13 delphi executable compilation filesize delphi-2009

最近我经过长时间的停顿后回到Delphi并编写了一个相当简单的实用程序应用程序,我的客户请求支持旧版本...

我知道这些天大小并不重要,但令我感到奇怪的是,单元应用程序在编译时达到了1'084'416 b可执行文件.我写的唯一.pas单位大约是20.8k,主要是因为gui的丰富性.

uses条款如下:

uses
  Windows, Messages, SysUtils, Variants, Classes, Controls, Forms, strutils,
  Dialogs, ADODB, DB, DBGrids, ExtCtrls, DBCtrls, StdCtrls, Grids, Menus,
  Buttons;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有任何方法可以将应用程序的大小减少到300-400k或更少?

War*_* P 17

  1. 你做过调试或发布版本吗?(将其发布为更小的尺寸,确保优化已打开,调试信息已关闭)

  2. 如果不需要,您是否关闭了RTII(delphi 2010及以上版本)?(EXE尺寸越小.)

  3. 主单元的uses子句中的单元数不是猜测EXE大小的好方法.可以这样想:VCL本身是一个大量的代码,数据库层是另一个,你写的东西可能只是EXE大小的一小部分.

  4. 要了解您的可执行文件大小,请尝试使用JCL Project Analyzer,或者阅读打开Map选项时生成的MAP文件.这将告诉您可执行文件中的确切内容.

由于各种原因,这将是愚蠢的,但你可以通过使用Delphi 7获得更小的可执行文件.最后,当我创建一个应用程序而我想让它变小时,我会看看需要花多少时间,以及重建所有内容的努力(例如使用vcl替代方案)然后我对自己说,忘了它.

  • 删除未使用的单位可以降低exe大小.特别是如果它们具有初始化代码(通常使得具有RTTI(也非D2010)的代码可达).但是,只有在程序中的其他位置不使用该单元时,包括您使用的第三方单元.您使用条款中的卫生是一个很好的做法. (6认同)

RRU*_*RUZ 13

  • 您可以尝试使用KOL(密钥对象库是一组对象,使用Delphi但不使用VCL 来开发功能(但很小)的32位Windows GUI应用程序).KOL允许创建非常紧凑的Windows32 GUI应用程序(从没有压缩的~11K开始 - 如果使用建议的系统单元替换).大部分代码都转换为内置汇编程序.

  • 另一种选择是使用像UPX这样的exe压缩器.

  • 不会使用UPX,除非您希望让客户打电话询问您的程序整天出现防病毒警告. (9认同)
  • 另请参阅http://stackoverflow.com/questions/353634/are-there-any-downsides-to-using-upx-to-compress-a-windows-executable (2认同)
  • @Marco,我知道使用UPX会导致一些孤立的误报情况,但我相信使用UPX仍然是一个有效的选择. (2认同)
  • 尽管UPX减少了exe大小,但它增加了可执行文件所需的内存. (2认同)

Vil*_*nde 8

MapFileStats(DelphiTools.info)是一个很好的(免费)工具,可以让你看到每个单元在你的可执行文件中占用多少空间.我自己的工具DelphiUnitSizes是一种替代方案,除了单位大小外,还显示每个函数或类的大小.

Delphi 2010使默认可执行文件大约增加了30%,可能是因为RTL/VCL单元中包含RTTI,因此您可以使用较旧版本的Delphi来实现较小的exe大小.

正如其他人所说,UPX也是一个很好的工具,但是根据我的经验,病毒扫描仪的误报并不常见.

使用自定义系统单元和UPX压缩可以大大减少Delphi可执行文件的大小.我可以使用基于Delphi的游戏生成器ZGameEditor生成大小小于64kb的exe文件,即使使用Delphi Berlin也是如此.


Jim*_*eth 6

你的DFM有多大?它作为EXE中的资源包含在内.根据GUI的复杂程度,您可能会发现在运行时使用代码创建GUI可能会减小EXE的大小.