Delphi XE3生成的EXE文件大小比Delphi 7大25倍。

15
作为一个测试,我决定在Delphi 4、5、6、7、2005、2010和XE3中创建一个简单的“Hello world”应用程序。该应用程序仅包含一个TForm以及一个TButton并带有一个OnClick事件,该事件会调用ShowMessage('Hello world')。
下面是每个最终EXE关闭调试后的结果: 文件大小 有人能解释一下为什么XE3版本比之前的Delphi版本平均大26倍吗?
这是我的XE3项目设置: 设置1 设置2

请查看以下问题的评论和答案:http://stackoverflow.com/questions/9167938/difference-between-delphi-7-and-delphi-2010-executable-size - Dale M
无法重现。对我来说是2230KB。 - David Heffernan
@DaleM 或许是真的,但是2倍和25倍之间有很大的差距。而且那是2010年的情况,现在已经是XE3了。 - Jerry Dodge
我想要一个标签[size-matters] - OnTheFly
你尝试过几次了?肯定有些东西在XE3中你做了但在其它版本中没有做。试着创建一个新的虚拟应用程序,也许你包含了其他你忘记删除的单元。 - Jerry Dodge
我建议安装JCL地图包(“项目信息”菜单项)。 - OnTheFly
4个回答

10

你可能只是在将配置更改为“Release”后进行了编译。尝试执行重新构建(不是重新编译)。这将真正激活可执行文件的“Release”配置,可能会使文件大小更小。

对于我来说(Delphi XE2),同一应用程序(发布配置)在 Windows 中报告的大小为:

1.52 MB(1,600,512 字节)


1
Delphi确实会生成非常大的可执行文件。我不相信RTTI是原因。编译器在这方面同样效率低下,就像它在优化方面一样。简单来说,Embarcadero不关心可执行文件的大小。但对于具有有限资源的移动应用程序来说,这是一个大问题。 - Mehmet Fide
1
@BasePointer RTTI 的意思是智能链接器无法剥离未使用的函数。导致可执行文件变大的原因有很多,但新型 RTTI 可能是最大的因素。在桌面上,可执行文件的大小在运行时并不重要。只有在下载安装程序时才会成为问题。 - David Heffernan

6
我找到了问题所在。这是因为我99%的时间都使用Delphi 7进行开发,而XE3对我来说是新的。尽管我在项目选项中选择了“发布”并进行了一些调整,但事实证明,仅仅在那里选择“发布”并不能将项目置于发布模式。
谁会想到我还必须使用项目管理器面板,并双击“发布”项才能将项目置于发布模式呢?
如果有人感兴趣,最终的EXE现在是2,229 KB,仅比Delphi 2010之前的EXE大小大5倍。

你知道你可以创建任意数量的配置文件吗?比方说,假设你有20个不同的构建配置,而你正在处理其中一个。当你要调试这个特定的配置时,你真的想让全部20个都被编译吗?我是说,那会需要20倍的时间。所以换句话说,是的,你需要在这里进行更改。 - Jerry Dodge
4
不,我不知道。也许 Embarcadero 需要一份“欢迎来到21世纪”的快速入门白皮书,针对那些使用 Delphi 7 及以下版本的开发人员,解释新功能和重要性。 :-) - user1527613
8
请接受 @Steve 的答案。IDE 的行为正如预期的那样。可以在不改变活动配置的情况下编辑不同配置选项的设置,这是非常合理的。 - David Heffernan
1
还是五倍的大小?呃! - lkessler
如果你真的想要一次编译多个活动构建配置文件,你可以使用"Build Groups"。请参见:http://docwiki.embarcadero.com/RADStudio/XE3/zh/Build_Groups - Uwe Raabe
1
你不需要在项目管理器中额外更改它;你只需要在那里更改它。项目选项中的目标只是为了向您显示该目标的选项,如果那不是您实际的目标也没有关系。 - stevenvh

2

只需将以下几行代码放在你的 .dpr 文件中,可以减小 exe 文件大小 20%。

uses Windows,

{$O+} {$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}


1
仅针对 exe 文件执行翻译。 - user4074041
Delphi 10.1 Berlin,[dcc32 Error] FinalFrontier.dpr(4): E2003 未声明的标识符:'IMAGE_FILE_RELOCS_STRIPPED' - Jerry Dodge
@JerryDodge 添加 uses Windows 可以解决该错误信息。 - Kromster

0

嗯...有很多东西可以解释旧版Delphi和新版之间的区别,重要的是支持Unicode (D2009 .. DXE4),所有字符在Unicode中分配2个字节(在D1,D2,D3,D7等中只分配一个字节)


9
不,那不是真正的大问题。每个版本中总是有更多的代码。但是重大变化是新的样式RTTI,它大大增加了VCL单元的大小。但在这种情况下,只是简单的调试与发布之间的差别。 - David Heffernan
3
"重要的事情"?真的吗?但这只能解释最多改变一倍。 - Andreas Rejbrand
大卫:根据我的经验,从2007到2009,.exe文件大小增加了最显著的一倍,可能是由于Unicode重写RTL所致。D2010由于RTTI再次增加,但如果你将其大部分关闭,它比2007到2009年的峰值要小。 - Marco van de Voort

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接