【问题标题】:How can I set the $RTTI directive for the entire project?如何为整个项目设置 $RTTI 指令?
【发布时间】:2010-01-14 23:31:22
【问题描述】:

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

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

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

【问题讨论】:

    标签: delphi delphi-2010 rtti


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我尝试将-weaklinkrtti 放在项目选项的“传递给编译器的附加选项”字段中,但它只是给出了编译器警告:[DCC 警告] W1030 无效的编译器指令:'–weaklinkrtti '。
      • 抱歉 Mason,您必须在项目选项中包含 $。我的错。编辑答案。
      【解决方案3】:

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

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

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

      这将确保没有 RTTI 为您自己的代码或任何代码生成 您使用的第三方库,除非 他们在 RTTI 所在的单元中 生成是明确启用的。你 不能为 RTL 或 VCL 关闭它, 但这不应该增加太多 反正你的尺寸。

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          【解决方案5】:

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

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

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

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-05-13
            • 2014-07-05
            • 1970-01-01
            • 1970-01-01
            • 2015-01-01
            • 2016-03-23
            • 1970-01-01
            • 2016-08-24
            相关资源
            最近更新 更多