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

时间:2010-01-27 20:31:04

标签: delphi delphi-2009 compilation executable filesize

最近我经过长时间的停顿后回到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;

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

8 个答案:

答案 0 :(得分:17)

  1. 您是否进行了调试或发布版本? (将其发布为较小的尺寸,确保优化已打开,调试信息已关闭)

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

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

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

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

答案 1 :(得分:13)

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

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

答案 2 :(得分:8)

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

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

正如其他人所提到的UPX也是一个很好的工具,在我的经历中,病毒扫描者的误报并不常见。

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

答案 3 :(得分:6)

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

答案 4 :(得分:3)

您也可以考虑将以下行添加到项目文件的顶部:

{$SetPEFlags 1}

此处的说明:http://hallvards.blogspot.fr/2006/09/hack12-create-smaller-exe-files.html

答案 5 :(得分:2)

是的,但是您需要提供其他代码单元作为附加文件。正如.net需要程序集,你有VB运行时等,这只是Delphi运行时 - 但它嵌入在exe中。

另一种选择是压缩可执行文件,有可用的工具。

答案 6 :(得分:1)

  • 你说你要回德尔福了。如果您仍有旧版本可用,请使用它 - 每个新版本都会添加额外的功能,如果您不需要它们,那么没有它们的情况会更小。

  • 确保您只包含实际使用的单位。

但无论你做什么,我都非常怀疑你会降到300k。如果内存服务,即使是Delphi 2中的“hello world”应用程序也会比这更大。

答案 7 :(得分:0)

您是否有链接到项目中的资源文件或图片?

我认为ADODB还包括一些开销。如果您的应用程序确实使用了数据库,那么仅1MB对于文件大小来说并不算太糟糕?不要忘记你的应用只是这个exe - 不需要额外的dll等。