4

我正在将一个旧项目从 Delphi 2007 迁移到 Delphi 2010。我发现的一件事是生成的可执行文件的大小增加了一倍多,而原来的文件已经很大了。(超过 50 MB。)我怀疑其中很大一部分与扩展 RTTI 有关。

由于该项目早于 Delphi 2010,它不会在任何地方使用扩展的 RTTI,我想保守地包含它。有没有办法使用“项目选项”对话框全局设置{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}为默认值?我本来希望在$WEAKLINKRTTI某个地方有这个(和)的选项,但我没有看到它们。

有谁知道这是否可以通过“传递给编译器的附加选项”字段或其他方式来完成?我真的不想为项目中的每个单元添加包含文件,因为它们有几千个......

4

5 回答 5

6

$RTTI 指令的行为自 XE6 以来已经改变,因为它实际上是一个错误,因为它应该是当前单元的本地(实际上它是自 Delphi 2010 以来记录的)。

即使在一个单元中使用该指令也可能产生致命影响,因为由于该错误,它基本上切换了一个影响以下单元的全局标志(如编译顺序)。

于 2014-12-11T16:35:20.937 回答
4

您可以尝试使用dcc32 –$weaklinkrtti命令行选项。(如{$WEAKLINKRTTI ON})。
但这并没有{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}在每个单元中产生影响。
您最好的选择是将它放在包含文件中每个单元的顶部。
但是对于仍然会膨胀的 VCL/RTL,它就不会这样做了....

更新:还要确保你比较什么是可比的。例如,验证您是否没有在新 D2010 项目的链接器选项中包含调试信息,而 D2007 项目中可能没有它...

于 2010-01-15T03:07:58.140 回答
2

Mason 自己的博客上的评论中,作为对我的评论的回应,Mason 回答了这个问题。

尝试将这两行放在 DPR 的顶部,在 USES 子句之前:

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}

这将确保不会为您自己的代码或您使用的任何第三方库生成 RTTI,除非它们位于明确启用 RTTI 生成的单元中。您不能为 RTL 或 VCL 关闭它,但无论如何这不应该增加您的尺寸。

于 2011-01-05T11:42:27.893 回答
1

您确定这是由新的 RTTI 信息引起的吗?虽然它包含大量数据,但它不应该真正使应用程序的大小翻倍。

检查它是否不包括发布构建可执行文件中的调试信息。(项目选项 -> Delphi 编译器 -> 调试信息应为 False)

至于问题,我在 dpr 文件中的 uses 子句之前使用 {$WEAKLINKRTTI ON} ,它似乎工作正常。

于 2010-01-15T09:45:51.143 回答
0

我不知道这样的选项,但我仍然会使用包含文件。

{$i ProjectIncludeFile.inc}对于任何有经验的 Delphi 程序员来说,编写一个小程序来添加到文件夹中的任何单元(紧跟在单元行之后),我都不会成为问题。

这样你就可以将它用于你喜欢的任何目的。

我自己使用 if fi 设置WriteTempFiles编译器指令(我在开发程序时使用 fi 将 stringlist 内容保存在不同的地方),这样我可以在程序准备好部署时在一个地方禁用它。

由于我的大多数项目都涉及多个可执行文件和/或 dll,因此这是为整个项目全局完成此任务的最简单方法。

于 2010-01-15T07:42:58.960 回答