Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 减少exe文件_Delphi_File_Exe_Delphi Xe2 - Fatal编程技术网

Delphi 减少exe文件

Delphi 减少exe文件,delphi,file,exe,delphi-xe2,Delphi,File,Exe,Delphi Xe2,使用Delphi(或者通常的任何工具,如果有的话),是否可以减小exe文件的大小,删除所有未使用但存在的代码? (例如,存在但从未调用的函数或过程)。 我记得在Pascal中,使用unit(不带对象)编译器只包含真正使用的过程和函数,并将从最终的exe中删除单元中未使用的例程 对于Object pascal,我记得在Delphi 1中,对象的所有成员都包含在exe中 自Delphi-XE2之后是否有更改?如果您不使用RTTI,可以将其添加到.dpr文件的顶部(紧跟在程序之后),以删除额外的RTT

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

对于Object pascal,我记得在Delphi 1中,对象的所有成员都包含在exe中

自Delphi-XE2之后是否有更改?

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

{$IFOPT D-}{$WEAKLINKRTTI ON}{$ENDIF}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
如果您想将其从所有RTL/VCL单元中剥离出来,那么您还需要在项目文件中包含这些单元,以便上述设置能够生效。我不认为我会建议这样做,因为我不认为减少可执行文件的大小值得编译自己的RTL/VCL

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

{$SetPEFlags IMAGE_FILE_RELOCS_STRIPPED}

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

Delphi有一个智能链接选项,如果我没记错的话,默认情况下它是打开的。它和你描述的一模一样。只有使用过的函数和数据链接到exe。如果您需要进一步的大小压缩,您可以尝试许多“exe compressor”程序中的一个。

如果您的目标是减少可执行文件的大小,您可以使用一个工具来压缩它,并允许在未压缩时执行它。。(=不是拉链)

例如,您可以检查哪些与delphi程序配合良好。

-优秀文章

(摘自上面的链接)

通常,用Delphi创建的EXE文件比EXE文件大 用另一种编程语言创建。原因是VCL。 (当然,VCL有很多优点…)

有几种方法可以减小EXE的大小:

01)使用EXE打包机(UPX、ASPack等)-

02)使用KOL

03)在不使用VCL的情况下编写应用程序

04)使用ACL(API控件库)

05)使用StripReloc

06)停用远程调试信息和TD32

07)您可能希望将代码放入dll中

08)不要在表单上多次放置相同的图像。在运行时加载它们

09)使用压缩图像(JPG而非BMP)

10) 在DFM文件中存储较少的属性


只是为了补充别人写的东西

智能链接器将删除未使用的例程,以下情况除外:

  • 该单元有一个
    初始化
    部分-不幸的是,RTL/VCL中的许多最大单元(类、系统、窗口、窗体…等等)都有初始化部分,因此如果它们在
    uses
    子句中,您可以将整个enchilada链接到您的代码中。RTL/VCL中的大部分代码都可以重构以减少或消除这种情况,但这会破坏向后兼容性

  • 例程是类的一部分,并标记为虚拟或动态-如果您在代码中实例化并对象具有虚拟或动态方法,则无论您是否调用这些方法,这些方法都会链接到可执行文件中

减少exe文件大小可采取的其他步骤:

  • 利用表单继承—如果您有许多类似的表单,请为它们创建一个基础表单以从中继承。这些子窗体将只在其dfms中存储与基窗体不同的属性。这可以通过消除dfms中的冗余信息,大大减少可执行文件的大小

  • 将任何大型图形存储在外部文件中,并根据需要加载它们-启动屏幕、“皮肤”、图标集等确实会膨胀到exe的大小。当这些文件嵌入exe时,Delphi并不总是以最有效的格式存储它们

  • 编译完exe后,可以从exe中剥离某些未使用的数据,从而将exe的大小减少10%-30%。有第三方工具可以做到这一点,但您可以通过设置适当的PE头来消除一些缺点。在使用前,请确保您了解每个标志的含义,因为某些标志可能会使exe无法使用

  • 将RTL/VLC的一部分复制到您自己的单元中—不要在uses子句中包含类或sysutil,而是创建一个新单元,并将您需要的类和函数复制到单元中。然后改用它

  • 将代码分解为可加载的模块-如果您有多个重复使用相同单元的EXE,您可以通过使用DLL或BPL,而不是静态地将所有内容链接到EXE,使它们变小。一个dll/bpl只会加载到内存中一次,不管有多少个EXE需要它


这在很大程度上是正确的,但RTTI最近的变化让事情变得有些复杂。嗯,我没有使用最新的Delphis+1获取信息。在使用UPX之前,您应该阅读以了解其缺点。如果您关闭RTTI,新的Livebinding功能将无法工作。@Robert是的,我想如果没有RTTI,很多事情都会失败。但我敢打赌,绝大多数现存代码都会很好。希望在我实现$SetPEFlags时您也在场。你的自信会使我的工作简单得多。如果命运不同意我们的决定,我会有一个得心应手的替罪羊从MSDN:“虽然这可能会在可执行文件中节省空间,但可能会导致可执行文件无法在其他基于Win32的实现上工作。例如,假设您为Windows NT构建了一个EXE,并将EXE设置为0x10000。如果您告诉链接器剥离重新定位,EXE将不会在Windows 95下运行,因为地址0x10000已经在使用中。”