使用 Delphi(或者一般来说任何工具,如果存在的话),是否可以减小 exe 文件的大小,删除所有未使用但存在的代码?
(例如,存在但从未调用过的函数或过程)。
我记得在 Pascal 中,使用单元(没有对象)编译器只包含真正使用的过程和函数,并且会从最终的 exe 中去除单元中未使用的例程。
使用 Object-pascal,我记得在 Delphi 1 中,对象的所有成员都包含在 exe 中;
自 Delphi-XE2 以来有什么变化吗?
使用 Delphi(或者一般来说任何工具,如果存在的话),是否可以减小 exe 文件的大小,删除所有未使用但存在的代码?
(例如,存在但从未调用过的函数或过程)。
我记得在 Pascal 中,使用单元(没有对象)编译器只包含真正使用的过程和函数,并且会从最终的 exe 中去除单元中未使用的例程。
使用 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-Packer (UPX, ASPack,...)- UPX
02) 使用KOL。
03) 在没有 VCL 的情况下编写应用程序
04) 使用 ACL(API 控件库)
05) 使用 StripReloc。
06) 禁用远程调试信息和TD32。
07)您可能希望将代码放入 dll 中。
08)不要在一个表格上多次放置相同的图像。在运行时加载它们。
09) 使用压缩图像(JPG 而不是 BMP)
10) 在 DFM 文件中存储较少的属性
如果您的目标是减小可执行文件的大小,您可以使用压缩它并允许执行它的工具,因为它没有被压缩..(=不是 zip)
例如,您可以检查UPX与 delphi 程序配合得很好。
如果我没记错的话,Delphi 有一个智能链接选项,默认情况下是打开的。它完全符合您的描述。只有使用过的函数和数据会链接到您的 exe。如果您需要进一步的大小压缩,您可以尝试许多“exe 压缩器”程序之一。
只是为了补充其他人写的...
智能链接器将消除未使用的例程,但以下情况除外:
该单元有一个initialization
部分 - 不幸的是,RTL/VCL 中的许多最大单元(类、SysUtils、Windows、表单......等等)都有初始化部分,所以如果它们在你的uses
子句中,你会得到整个 enchilada 链接到你的代码。RTL/VCL 中的许多代码可以重构以减少或消除这种情况,但它会破坏向后兼容性。
该例程是类的一部分并被标记为虚拟或动态- 如果您在具有虚拟或动态方法的代码中实例化和对象,则无论您是否调用它们,这些方法都会链接到您的可执行文件中。
可以采取的其他步骤来减少 exe 文件的大小:
利用表单继承 - 如果您有许多相似的表单,请创建一个基本表单供它们继承。这些子表单将仅在其 dfms 中存储与基本表单不同的属性。这可以通过消除 dfms 中的冗余信息来大大减少可执行文件的大小。
将任何大型图形存储在外部文件中并按需加载它们 - 启动画面、“皮肤”、图标集等确实会增加 exe 的大小。当它们嵌入到 exe 中时,Delphi 并不总是以最有效的格式存储这些文件。
通过在编译后从 exe 中删除某些未使用的数据,您可以将 exe 的大小减少 10% - 30%。有第三方工具可以做到这一点,但您可以通过设置适当的 PE 标头标志来消除一些麻烦。在使用它之前,请确保您了解每个标志的含义,因为某些标志可能会使您的 exe 无法使用。
将 RTL/VLC 的部分复制到您自己的单元中 - 而不是在您的 uses 子句中包含类或 SysUtils,创建一个新单元并将您需要的类和函数复制到单元中。然后改用它。
将代码分解为可加载模块 - 如果您有多个重复使用相同单元的 exe,您可以使用 dll 或 bpls 将它们缩小,而不是将所有内容静态链接到 exe。无论有多少 exe 需要,一个 dll/bpl 只会被加载到内存中一次。