我该怎么做才能减少我的可执行文件的大小(Delphi)?

时间:2010-07-07 22:43:45

标签: delphi build-process executable

我使用Delphi 2009为桌面程序发布了一个可执行文件(.EXE)。我没有运行程序所需的外部DLL或资源。

我使用了两个组件:LMD Innovative's ELPackSergey Tkachenko's TRichView,它们被编译到我的可执行文件中。

当我使用“Release”构建配置构建我的生产版本时,生成的可执行文件是13,533 KB。

在使用Delphi 2009之前,我使用的是Delphi 4.它生成的可执行文件只有2,671 KB,同时包含相同的两个组件,并且基本上具有与我当前版本相同的代码。

我确实理解Delphi 2009完全是Unicode(这是我升级的主要原因),而且Unicode可以导致大小增加一倍。但这大约要大5倍。

为什么我的可执行文件必须保持5倍大?或者是否有一些简单的方法可以减少可执行文件大小的重要部分?


请注意。有些人正在回答压缩Delphi EXE的方法。这不是我想要做的。我试图简单地看到为什么这么多空间被用来删除可能没有必要的东西。如果这样做,如果需要,之后仍然可以进行压缩。

安装后,可执行文件的大小都无关紧要。它用于下载目的,并最大限度地减少要压缩它的服务器负载和下载时间。我更喜欢使用Inno Setup并在安装例程中压缩程序本身。然后在安装时,它将扩展为完整大小。这既可以防止可能的病毒检测,又可以消除在内存中解压缩程序所需的额外启动时间。此外,我对可执行文件和我的安装例程进行编码,并且一些压缩技术与此不兼容。

有关压缩的详细信息,请参阅StackOverflow问题:Delphi EXE compressor?


ldsandon让我准确提供我正在使用的选项,所以这里是:

Compiling Options http://www.beholdgenealogy.com/img/compilingoptions.jpg

Linking Options http://www.beholdgenealogy.com/img/linkingoptions.jpg

16 个答案:

答案 0 :(得分:14)

从Delphi 7迁移到Delphi 2010时,我们的.exe版本从16 megs增长到35 megs。

几周前,我在Embarcadero论坛上问了一个与你类似的问题。 (link)在我的OP中,我列出了一些关于此主题的链接,您可能会发现这些链接很有帮助。

我们尝试使用UPX压缩我们的.exe文件。让它工作几个小时显着减少了我们的.exe,但出于以下原因我们可能不会在生产中使用它:

  1. 我们有很多.exe并且不想在每次构建时等待1/2天。 (我们可能会向UPX找到一套非暴力的参数来减少这种情况......)

  2. 虽然.exe的大小减少了,但我们的可发送却没有,因为我们的安装程序(不足为奇)无法从已经压缩的文件中挤出更多的压缩...而它能够将原来的16兆.exe减少到8兆。

  3. 我读过一些报道称,在某些时候(很少但并非永远不会),UPX exe会触发各种反病毒程序来报告包含病毒的应用程序。 (我不记得我看到这个的日期,网站或细节,所以在这里报告它对我来说有点不公平。)但是,我们非常不利于承担甚至可能发生的风险,UPX不在场......

  4. Embarcadero论坛上的链接还包括link到该主题的另一个SO主题。

    我继续对我们在迁移到Delphi 2010时发现的代码膨胀感到惊讶和失望。正如Nick指出的那样,2X for Unicode非常过分。

    然而,在转向D2010时,膨胀是一个相对较小的权衡,因为,IMO,D2010在很多其他方面都是如此惊人的升级。但是,它确实意味着我们可能不得不转向运送2张CD而不是一张。我不期待看到我们组织对此的反应......

答案 1 :(得分:10)

如果没有看到“Release”构建配置使用的实际设置,解释这种大小的增加需要大量猜测。

除了一些可能不太可能的因素导致即使不使用代码被“拖入”的数量大幅增加,增加幅度最容易通过包含调试信息来解释。

我会检查你的编译器和链接器设置:

  • 调试信息(编译器设置)
  • TD32 info(链接器)
  • 远程调试信息(链接器)

将Delphi 2009项目中的这些设置与Delphi 4中的等效项进行比较。

答案 2 :(得分:7)

将Unicode的预期增长率提高2倍,最终导致无法计算增加2.5倍。考虑到您跳过了多少个版本,这是有道理的。自Delphi 4以来,VCL和RTL已经添加了很多,而且并非所有这些都可以轻松实现智能链接,即使您从未使用它。根据您使用的单位数量,您可能需要承担相当多的额外行李。

Allen Bauer和编译团队增加了a new feature into D2010 to help reduce this,但显然他们谨慎行事,并没有在尽可能多的地方使用它。希望我们在2011年和随后的版本中看到更多的减少。

答案 3 :(得分:7)

我会加上我的几句话。 链接器只有在遵循代码层次结构时才能删除未使用的过程和函数。下面列出的链接器的噩梦列表:

  • 消息驱动的代码,令人遗憾的是,这段代码无法删除,这就是Delphi空白项目规模从版本到版本不断增长的原因。每个新的Windows消息(例如WM_TOUCH,只要我知道最近介绍)创建了无法删除的过程调用层次结构(即使您根本没有计划使用Touch API)。这是因为每个 案例WM _: 片段都是链接器无法决定是否使用它的东西。

  • 从单元的开始端,初始化,终结部分访问的代码和数据结构。在这里你有一些控制,删除不必要的调用或对象创建。即使您按需创建对象并且只在最终确定部分释放它们,也要小心使用

答案 4 :(得分:5)

使用“upx - 压缩或扩展可执行文件”@ http://upx.sourceforge.net


如果你去工具/配置工具,并像这样设置它,你可以通过IDE中的菜单项轻松压缩你正在处理的可执行文件。

Configuration

答案 5 :(得分:4)

另一种方法是看看'什么单位增加尺寸?'。

为此,我使用JCL'Project Analyzer IDE',它集成在IDE中并安装了JCL / JVCL,它会显示所有具有各自大小的单元。您可以将其导出到文本文件中。 如果您使用2个环境(D4和D2009),您将获得许多相关信息。

答案 6 :(得分:4)

答案 7 :(得分:3)

检查dfm-s的格式。如果你想让你的exe更小,它们必须是二进制格式。

答案 8 :(得分:2)

如果您不想使用exe压缩器,那么您应该尝试StripReloc

答案 9 :(得分:2)

1)您正在生成详细的地图文件,并且因为您已设置“used debug dcus”,它还将包含RTL / VCL单元的符号。如果异常处理系统使用它来生成调用堆栈等,则可以将其添加到可执行文件中。如果不以某种方式压缩,它可能会使你的.exe大小相当大。

2)使用debug dcus也会使你的.exe更大一些,因为通常它们在没有设置优化和调试选项的情况下编译,并且它们也会使你的代码变慢。它们不应在发行版中使用。

3)调试信息应仅将debig信息添加到单元而不是可执行文件,尽管IIRC需要生成映射文件。

答案 10 :(得分:1)

由于D2010增加了扩展的RTTI,并且RTTI是增加exe大小的臭名昭着的因素,因此看看D2009二进制文件对于该应用程序有多大是很有趣的。

如果D2009二进制文件明显更小,则不是Unicode等。对于我自己的二进制文件,我从D7到D2009只增加了30%。

答案 11 :(得分:0)

新版delphi中的标准单元可能包含更多字符串和常量(如错误字符串),即使您禁用调试信息也会包含这些字符串和常量。检查您的用途。

除了不使用特定单元或从中删除不需要的数据外,不要太多分析。

(我的经验是Delphi 5)

答案 12 :(得分:0)

前面已经说过,使用可执行的压缩程序会减小exe的大小,但不会减小安装包的大小。但是,如果您想要一个好的压缩器,请尝试ASPack

@ Tom1952:ASPack非常快,压缩文件只需几秒钟

答案 13 :(得分:0)

您也可以更改图标。最新的delphi IDE(即XE3)中的图标兼容Vista / 7,包含所有尺寸(据我所知,最高可达256x256)。因此,您可以通过更改图标来减少exe文件大小。

答案 14 :(得分:0)

取消选中项目选项中的调试信息。 如果embarcadero无法提供任何解决方案或解释!我认为解决方案很简单:不要只使用Delphi,有很多编程语言,每一种都只受程序员的想象力限制。

答案 15 :(得分:0)

对于具有默认设置的Delphi 10.3 Rio:

步骤1:在“项目”窗口中从Debug切换到Release。这将我的exe文件从22 MB减少到5 MB!

第2步:使用像ASPack这样的exe压缩器。它进一步将我的exe文件减少到1.3 MB。难以置信,不是吗? :)