如何为整个项目设置$ RTTI指令?

时间:2010-01-14 23:31:23

标签: delphi delphi-2010 rtti

我正在努力将一个旧项目从Delphi 2007迁移到Delphi 2010.我发现有一件事是生成的可执行文件的大小增加了一倍以上,并且原始版本已经很大了。 (超过50 MB。)我怀疑它与扩展的RTTI有很大关系。

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

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

5 个答案:

答案 0 :(得分:5)

自从XE6以来,$ RTTI指令的行为已经改变,因为它实际上是bug,因为它应该是当前单元的本地(实际上是documented as that since Delphi 2010)。

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

答案 1 :(得分:4)

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

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

答案 2 :(得分:1)

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

检查它是否在发布版本可执行文件中不包含调试信息。 (项目选项 - > Delphi编译器 - >调试信息应该为假)

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

答案 3 :(得分:1)

comment on Mason's own blog中,为了回应我的评论,梅森回答了这个问题。

  

尝试将这两行放在顶部   您的DPR,在USES条款之前:

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

这将确保没有RTTI   为您自己的代码生成或任何   您使用的第三方库,除非   他们在RTTI的一个单位   生成已明确启用。您   无法为RTL或VCL关闭它,   但这不应该增加太多   无论如何你的尺寸。

答案 4 :(得分:0)

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

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

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

如果f.i.我自己使用设置WriteTempFiles编译器指令(我在开发程序时使用f.i.在各个地方保存stringlist内容),这样我就可以在程序准备好部署时在一个地方禁用它。

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