减少exe文件

Mar*_*ato 19 delphi exe file delphi-xe2

使用Delphi(或者通常是任何工具,如果存在的话),是否可以减小exe文件的大小,删除所有未使用但存在的代码?
(例如,存在但从不调用的函数或过程).
我记得使用Pascal,使用unit(没有对象),编译器只包含真正使用的过程和函数,并将从最终的exe中删除单元中未使用的例程.

使用Object-pascal,我记得在Delphi 1中,一个对象的所有成员都包含在exe中;
有什么变化,直到Delphi-XE2?

Dav*_*nan 20

如果您不使用RTTI,可以将其添加到.dpr文件的顶部(紧接其后program)以删除额外的RTTI信息:

{$IFOPT D-}{$WEAKLINKRTTI ON}{$ENDIF}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
Run Code Online (Sandbox Code Playgroud)

如果要将其从所有RTL/VCL单元中剥离出来,那么您还需要将它们包含在项目文件中,以便上述设置生效.我不认为我会这样做,因为我不相信减少可执行文件大小值得编译自己的RTL/VCL的复杂性.

您还可以在.dpr文件中的某处添加以下内容:

{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}
Run Code Online (Sandbox Code Playgroud)

这将删除.exe中不需要的重定位信息.不要将它添加到DLL或包!

  • 如果关闭RTTI,新的Livebinding功能将无法使用. (4认同)
  • 当我实现$ SetPEFlags时,希望你在那里.你的信心会使我的工作变得更加简单.如果/当命运不同意我们的决定时,我会有一个方便的替罪羊.;> (2认同)
  • 来自 MSDN:“虽然这可以节省可执行文件中的空间,但它可能导致可执行文件无法在其他基于 Win32 的实现上运行。例如,假设您为 Windows NT 构建了一个 EXE,并将 EXE 放在 0x10000。如果您告诉链接器去除重定位,EXE 不会在 Windows 95 下运行,其中地址 0x10000 已在使用中。” http://msdn.microsoft.com/en-us/library/ms809762.aspx (2认同)
  • 当你建议人们关闭重新安置时,你应该告诉他们这些限制.没有什么是免费的. (2认同)

RBA*_*RBA 8

减少应用程序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文件中存储较少的属性