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

lke*_*ler 23 delphi executable build-process

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

我使用两个组件:LMD Innovative的ELPackSergey Tkachenko的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压缩器?


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

编译选项http://www.beholdgenealogy.com/img/compilingoptions.jpg

链接选项http://www.beholdgenealogy.com/img/linkingoptions.jpg

Rob*_*ank 14

当从Delphi 7迁移到Delphi 2010时,我们的.exe从例如16兆增加到35兆.

几个星期前,我在Embarcadero论坛上问了一个与你类似的问题.(链接)在我的OP中,我列出了一些关于这个主题的链接,你可能会觉得有帮助.

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

  1. 我们有很多.exe并且不希望每次构建都等待1/2天.(有可能我们可以为UPX找到一个非暴力的参数集来减少这个......)

  2. 虽然.exe文件的大小减小,我们可交付的不是,因为我们的安装程序(这并不奇怪)不能挤更加压缩了本已压缩文件...而这是能够减少原来的16兆的.exe下来到8兆.

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

Embarcadero论坛上的链接还包含指向此主题的另一个SO主题的链接.

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

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

  • @ Tom1952:你不能压缩两次.因此,最好使用安装程序进行压缩以减少下载大小.我使用InnoSetup,它将我的13.5 MB程序包含在一个只有4.5 MB的安装程序包中.运行安装程序时,它会将程序解压缩到完整大小,因此不会出现任何可能的病毒检测问题. (3认同)
  • D2010是一个不同的问题,因为它扩展了RTTI可能性,我可以想象,错误的管理(在任何地方打开它)可以膨胀exe.OP在谈论D2009. (2认同)

Del*_*ics 10

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

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

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

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

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

  • 您可能会对调试信息可以产生的差异感到惊讶.至少值得把它关掉然后找出来.此外,您是否正在使用MadExcept或任何类似的实用程序,可能会在后构建步骤中将MAP文件嵌入可执行文件中? (2认同)

Mas*_*ler 7

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

Allen Bauer和编译团队在D2010中增加了一项新功能,以帮助减少这一点,但显然他们谨慎行事,并没有尽可能多地使用它.希望我们在2011年和随后的版本中看到更多的减少.


小智 7

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

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

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


小智 5

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


如果您转到工具/配置工具,并将其设置为这样,您可以通过IDE中的菜单项轻松压缩您正在处理的可执行文件.

组态

  • IMO,你最好离开UPX以便以后在部署过程中使用.即在IDE中不要理会它,它只会减慢你的速度.等到你准备好部署,并在同一个工作(.bat文件,Visual Build Pro等等)中进行协同编码,本地化,构建设置等. (2认同)
  • 我问的问题不是简单地减少可执行文件的大小,而是要识别任何无用的超出大小,并找出为什么它在Delphi版本之间增长如此之多.为了减少下载时间,我使用InnoSetup创建压缩的安装文件.请参阅我对Tom1952的回答的评论. (2认同)