-2

可能重复:
减少 exe 文件

给定一个 EXE 文件,有哪些工具可以删除所有未使用的代码并使用应用程序真正使用的代码创建一个新的 EXE 文件?我认为应该存在这样的东西。只是为了好奇;但我认为它可以作为生成较小 EXE 文件而无需未使用代码的工具非常好。

PS:Delphi 生成独立的 EXE 文件,其中包含应用程序中使用的所有对象的代码,但并非该对象的所有元素都被真正使用。这会产生大文件。我记得 Pascal 的第一个版本只包含真正使用的代码,并且没有插入未使用的代码,而且 EXE 文件更小。

4

2 回答 2

1

当前的 Delphi 也排除了未使用的代码。你可以很容易地在 Delphi 中看到这一点。如果你编译,你会在代码的阴沟里得到“蓝点”。未使用的函数没有蓝点,这意味着它们被排除在外。如果您选中项目选项中的优化复选框,则会重写代码以更多地使用寄存器,从而消除某些变量。

尽管如此,Delphi 可执行文件还是会增长,尤其是在使用某些单元时。我认为您可以在 Delphi 7 中创建的最小 .exe 大约是 10Kb。在以后的版本中,这可能会更大一些。

文件大小的重要原因是

  1. 资源。大量或大量图像会占用大量空间。如果您在多个表单上使用图标,请确保将它们放在中央图像列表中(在共享数据源上)。使用可用的 PngImageList 实现之一来获得更小的图像尺寸以获得更好的质量。
  2. rtti。运行时类型信息会导致类定义消耗额外的空间。这个空间部分是由于关于类的元信息,但主要是因为所有额外的代码。可以使用 RTTI 调用的任何方法都可以以一种“后期绑定”方式进行绑定。因此,编译器无法知道这些方法是否可以消除,因此需要将它们包含在可执行文件中。
  3. 注册课程。与 2 类似。如果一个类被注册,则可以使用其名称作为字符串来获取和实例化它。这些类必须包含在项目中,即使它们从未使用过,只是因为编译器无法知道是否需要它们。

事实上,RTTI 在最近的 Delphi 版本中得到了扩展。我认为这也会导致关于类的 RTTI 元信息消耗更多空间。你能做的只有这么多。

总的来说,我认为 Delphi 编译器仍然做了很多优化。您不必担心 exe 文件的大小。如果你这样做,你可以试试像upx. 我对 upx 有很好的经验。它将可执行文件减少到其原始大小的五分之一或更少,同时保留所有功能。

于 2012-11-05T22:26:38.547 回答
0

如果您的应用程序很大,请检查您是否没有编译大量调试信息。尝试发布版本并检查它是否更小。

我有时做的是将项目配置为将所有 .dcu 文件编译到一个文件夹中。这样,您可以快速查看编译到 .exe 中的所有无用单元。您经常会为单个函数包含一个单元,但反过来您会得到一整棵依赖单元树。您只需要搜索您的使用子句并尝试以某种方式摆脱这些依赖关系。

我认为 gexperts 和 cnpack 都包含显示依赖项或扫描项目中未使用单元的工具。他们可以对此有所帮助。

删除无用的依赖项后,您始终可以使用 upx 压缩已编译的 exe。这有一些缺点(巴里凯利前段时间写过),但我有很好的经验。它有时会使文件变小 4 倍,这可能很重要。

于 2012-11-05T21:36:25.923 回答