使用 Delphi(或者一般的其他工具,如果有的话),是否有可能减小可执行文件的大小,删除未被使用但出现在其中的所有代码?(例如,一个存在但从未被调用的函数或过程)。
我记得在 Pascal 中,使用单元(不带对象)时,编译器仅包括真正使用的程序和函数,并将单元中未使用的例程从最终的可执行文件中剥离掉。
对于 Object-pascal,在 Delphi 1 中我记得所有对象成员都包含在 exe 文件中;
自那以后到 Delphi-XE2 是否有所改变?
使用 Delphi(或者一般的其他工具,如果有的话),是否有可能减小可执行文件的大小,删除未被使用但出现在其中的所有代码?(例如,一个存在但从未被调用的函数或过程)。
我记得在 Pascal 中,使用单元(不带对象)时,编译器仅包括真正使用的程序和函数,并将单元中未使用的例程从最终的可执行文件中剥离掉。
对于 Object-pascal,在 Delphi 1 中我记得所有对象成员都包含在 exe 文件中;
自那以后到 Delphi-XE2 是否有所改变?
如果你没有使用RTTI,你可以在你的.dpr文件顶部添加以下内容(紧跟着program
),以去除多余的RTTI信息:
{$IFOPT D-}{$WEAKLINKRTTI ON}{$ENDIF}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
如果你想从所有RTL / VCL单元中剥离它,那么你需要在项目文件中包含它们,以便上面的设置可以生效。我不认为我会建议这样做,因为我不认为减少可执行文件大小值得编译自己的RTL / VCL带来的复杂性。
你也可以在你的.dpr文件中的某个位置添加以下内容:
{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
这将删除在 .exe 文件中不需要的重定位信息。不要将此应用于 DLL 或软件包!
缩小应用程序 EXE 文件大小 - 绝妙的文章
(摘自上述链接)
一般来说,使用 Delphi 创建的 EXE 文件比使用其他编程语言创建的 EXE 文件更大。原因是 VCL。(当然,VCL 有许多优点...)
有几种方法可以减小 EXE 文件的大小:
01) 使用 EXE 打包工具(UPX、ASPack 等)- UPX
02) 使用 KOL。
03) 不使用 VCL 编写应用程序
04) 使用 ACL (API Controls Library)
05) 使用 StripReloc。
06) 关闭远程调试信息和 TD32。
07) 您可能需要将代码放置在 dll 中。
08) 不要在表单上多次放置相同的图像。在运行时加载它们。
09) 使用压缩图像 (JPG 而不是 BMP)
10) 在 DFM 文件中存储较少的属性
Delphi有一个名为智能链接的选项,默认情况下是打开的,如果我没记错的话。它正是你描述的那样。只有使用过的函数和数据会被链接到你的exe文件中。如果你需要更进一步的大小压缩,你可以尝试其中许多可用的“exe压缩器”程序之一。
单元具有初始化
部分-不幸的是,RTL/VCL中的许多最大单元(Classes、SysUtils、Windows、Forms等)都具有初始化部分,因此如果它们在您的uses
子句中,则会将整个代码链接到您的代码中。 RTL/VCL中的大部分代码可以重构以减少或消除这种情况,但这将破坏向后兼容性。
该例程是类的一部分,并标记为virtual或dynamic- 如果您在代码中实例化对象并具有虚拟或动态方法,则这些方法将链接到您的可执行文件中,无论您是否调用它们。
可以采取的其他步骤以减小exe文件大小:
利用表单继承 - 如果您有许多类似的表单,请为它们创建一个基本表单以进行继承。这些子表单仅会存储它们在 dfms 中与基础表单不同的属性。这可以通过消除 dfms 中的冗余信息大幅减小可执行文件的大小。
将任何大型图形存储在外部文件中并按需加载 - 启动画面、"皮肤"、图标集等可能真正膨胀 exe 的大小。当它们嵌入到 exe 中时,Delphi 并不总是以最有效的格式存储这些文件。
通过在编译后从 exe 中剥离某些未使用的数据,可以将 exe 的大小缩小 10% 到 30%。有第三方工具可以完成此任务,但您可以通过设置适当的 PE 标头 flags 来消除一些无用的东西。在使用之前,请确保了解每个标志的含义,因为某些标志可能会使您的 exe 无法使用。
将 RTL/VLC 的部分内容复制到自己的单元中 - 不要在 uses 子句中包括 Classes 或 SysUtils,而是创建一个新单元,将您需要的类和函数复制到该单元中,然后使用它。
将代码分解成可加载的模块 - 如果您有多个重用相同单元的 exes,您可以通过使用 dll 或 bpl 而不是将所有内容静态链接到 exes 中来使它们变小。无论需要多少个 exes,dll/bpl 只会在内存中加载一次。
/OPT:REF
选项,该选项会删除所有未使用的代码和数据。 - user26742873