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

Delphi 如何为整个项目设置$RTTI指令?,delphi,delphi-2010,rtti,Delphi,Delphi 2010,Rtti,我正在将一个旧项目从Delphi2007迁移到Delphi2010。我发现,生成的可执行文件的大小增加了一倍多,而原始文件已经相当大了。(超过50MB。)我怀疑其中很大一部分与扩展RTTI有关 由于该项目早于Delphi2010年,所以它在任何地方都不使用扩展RTTI,我希望保守地将其包括在内。是否有任何方法可以使用“项目选项”对话框将{$RTTI EXPLICIT METHODS([])属性([])字段([])}全局设置为默认值?我本以为在某个地方会有这样一个选项(对于$weakinkrti)

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

由于该项目早于Delphi2010年,所以它在任何地方都不使用扩展RTTI,我希望保守地将其包括在内。是否有任何方法可以使用“项目选项”对话框将
{$RTTI EXPLICIT METHODS([])属性([])字段([])}
全局设置为默认值?我本以为在某个地方会有这样一个选项(对于
$weakinkrti
),但我看不到它们


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

您可以尝试使用
dcc32–$weakinkrti
命令行选项。(如
{$weakinkrti ON}
)。
但这并不影响每个单元中的
{$RTTI显式方法([])属性([])字段([])}

最好将其放在包含文件中每个单元的顶部。
但对于仍然会膨胀的VCL/RTL,它不会这样做


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

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

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

这样你就可以把它用在任何你喜欢的用途上

我自己使用if.I.设置
WriteTempFiles
编译器指令(在开发程序时,我使用f.I.在不同的位置保存stringlist内容),这样我就可以在程序准备部署时在一个位置禁用它


由于我的大多数项目都涉及多个可执行文件和/或dll,因此对于整个项目来说,这是实现全局性的最简单方法。

您确定这是由新的RTTI信息引起的吗?虽然数据量很大,但实际上不应该使应用程序的大小增加一倍

检查版本生成可执行文件中是否未包含调试信息。 (项目选项->Delphi编译器->调试信息应为False)

至于这个问题,我在dpr文件中的uses子句之前使用了{$weakinkrti ON},它似乎工作得很好。

在回答我的评论时,Mason回答了这个问题

试着把这两行放在最上面 在使用条款之前,您的DPR:

{$WEAKLINKRTTI ON}
{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
这将确保不存在RTTI 为您自己的代码或任何 您使用的第三方库,除非 他们在一个单位里,RTTI 显式启用生成。你 无法为RTL或VCL关闭它, 但这不应该给我们带来太多麻烦 不管怎样,你的尺寸


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


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

我尝试将
-weakinkrti
放在项目选项中的“传递给编译器的附加选项”字段中,但它只是给出了一个编译器警告:[DCC警告]W1030无效的编译器指令:'-weakinkrti'。对不起,Mason,您必须在项目选项中包含$。我的错。编辑答案。