【问题标题】:How to achieve smaller size of the executable?如何实现更小的可执行文件?
【发布时间】:2011-01-10 03:18:55
【问题描述】:

最近我在长时间的停顿后回到了 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 或更小?

【问题讨论】:

  • @ChaosPandion:存储不是这里唯一的考虑因素。除此之外,更大的文件意味着更长的下载时间,这会影响最终用户对程序质量的看法。
  • Mason Wheeler:它还强制用户感觉它只是一个实用程序而不是应用程序。

标签: delphi delphi-2009 compilation executable filesize


【解决方案1】:
  • 您可以尝试使用KOL(Key Objects Library 是一组使用 Delphi 但没有 VCL 开发强大(但)32位 Windows GUI 应用程序的对象)。 KOL 允许创建非常紧凑的 Windows32 GUI 应用程序(从 ~11K 开始,没有压缩 - 如果使用建议的系统单元替换)。大部分代码被转换为内置汇编程序。

  • 另一种选择是使用 exe 压缩器,例如 UPX

【讨论】:

  • 不会使用 UPX,除非您想让客户整天打电话询问您的程序出现在防病毒警告中。
  • @Marco,我知道存在一些因使用 UPX 而导致误报的孤立案例,但我相信使用 UPX 仍然是一个有效的选择。
  • @RRUZ:我们放弃了,麻烦大于收获。但是如果你例如通过 ISDN 左右交付到自己公司的桌面,并且只需要处理一种病毒(公司范围内的病毒),我想它是可以生存的并且值得付出努力。
  • 虽然 UPX 减小了 exe 大小,但它增加了可执行文件所需的内存。
【解决方案2】:

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

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

正如其他人提到的那样,UPX 也是一个很棒的工具,根据我的经验,病毒扫描程序的误报并不常见。

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

【讨论】:

    【解决方案3】:
    1. 您是否进行了调试或发布构建? (将其发布为更小的尺寸,确保优化已开启,调试信息已关闭)

    2. 如果不需要,您是否关闭了 RTII(delphi 2010 及更高版本)? (较小的 EXE 大小。)

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

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

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

    【讨论】:

    • 删除未使用的单元可以降低 exe 大小。特别是如果他们有初始化代码(这通常使带有 RTTI(也非 D2010)的代码可以访问)。但仅当该单元未在程序中的其他地方使用时,包括您使用的第 3 方单元。不过,使用条款中的卫生是一个很好的做法。
    • 只需选择“Release”而不是“Debug”,13mb 的文件将被压缩到 2mb !!!!!!
    • 我的回答已经说过,当我六年前写的时候。为什么再说一遍?
    【解决方案4】:

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

    {$SetPEFlags 1}
    

    此处解释:http://hallvards.blogspot.fr/2006/09/hack12-create-smaller-exe-files.html

    【讨论】:

      【解决方案5】:
      • 你说你要回到 Delphi。如果您仍有旧版本可用,请使用它 - 每个新版本都会添加额外功能,如果您不需要它们,您的 exe 会更小。

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

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

      【讨论】:

        【解决方案6】:

        你有链接到项目中的资源文件或图片吗?

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

        【讨论】:

          【解决方案7】:

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

          【讨论】:

          • (以及未使用的属性,运行时实例化使得组件的名称不需要,节省一些字符串)
          • DFM 为 17'103 b。忘记提了。
          【解决方案8】:

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

          另一种选择是压缩可执行文件,周围有相应的工具。

          【讨论】:

          • 您能否为第二种选择推荐一个免费工具?
          • UPX 是一个开源打包程序。
          • 别人比我快,UPX是家喻户晓的。
          • 感谢 upx alternative,我从来没有朝那个方向搜索过。似乎是一个部分解决方案,因为它将大小减少到超过 300k。
          猜你喜欢
          • 2022-01-13
          • 2019-08-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多