【问题标题】:delphi xe disable RTTIdelphi xe禁用RTTI
【发布时间】:2011-04-27 21:06:37
【问题描述】:

我最近使用了delphi xe,但是由于rtti,exe文件非常大(我认为)

如何删除 rtti,我可以在不压缩的情况下使我的应用程序大小像 delphi 2009 应用程序(490 kb)一样小吗?还有rtti有什么用

【问题讨论】:

  • 你的 exe 有多大?你期待什么?

标签: delphi rtti delphi-xe application-size


【解决方案1】:

【讨论】:

  • +1 用于背景信息的链接,但如果您提供 gabr 现在直接在您的回答中所做的声明会很好。
【解决方案2】:

简而言之(由飞溅答案中的链接提供的完整故事):

{$RTTI 显式方法([]) 属性([]) 字段([])}

请注意,as of XE6 and newer, this needs to be in each individual unit for which you want to disable RTTI. 在此之前(XE5 及以下)可能位于 DPR 文件中,并适用于项目中的所有单元。

【讨论】:

  • +1 以获得确切的声明,否则您需要通过挖掘文档来找到它,因为它们主要针对如何使用它而不是如何关闭它。
  • 您的 RTTI 语句在我的 D2010 上使用时会导致编译器错误:DCC 致命错误:E2158 系统单元已过期或损坏:缺少 TVisibilityClasses。有什么建议吗?
  • 只有这个:docwiki.embarcadero.com/RADStudio/en/…missing'%25s'_%28Delphi%29 你想重新编译系统单元吗?也许你应该在这里问一个新问题——更多的人会这样看。
  • 为什么在 DLL 项目中默认不关闭?如果没有性能差异
  • 链接:docwiki.embarcadero.com/RADStudio/Alexandria/en/… 说:范围:本地(答案中的链接不再可用)
【解决方案3】:

我不认为是 RTTI 为您的应用程序增加了如此多的大小开销。你怎么知道?

【讨论】:

    【解决方案4】:

    您的问题与 RTTI 无关。如果您谈论的是相对较小的增加(100-200K),这是由于 RTL 中的额外功能(为 Unicode 支持等而添加的)。如果您增加了 500-700K 左右,那么请检查您是否链接了 VCL UI 单元(表单、控件等)。如果您增加了 3Mb,那么您已经打开了额外的调试符号。

    【讨论】:

    • 但我认为 Unicode 已经在 Delphi 2009 中(基本应用程序只有 499 kb)但是 Delphi xe vcl 没有太大的改进(delphi xe 应用程序大小 800 kb)所以我认为额外的 300 kb 是大多数形成 RTTI。和 d2007 应用程序(没有 unicode 约为 350 kb)
    • 为什么您认为 RTTI 没有出现在 Delphi 2009 中?
    • @Eugene:如果 Unicode 函数替换 ANSI 函数,而不是被添加,你为什么认为它是 Unicode 函数?每个人都在谈论的“智能链接器”在哪里?德尔福? ...如果它无法弄清楚大部分代码是不必要的,那么它可能毕竟不是那么聪明。
    • @STATUS_ACCESS_DENIED Unicode 函数没有取代 ANSI 函数,而是扩展了它们。 IE。对于某些函数,现在同时存在 ANSI 和 Unicode 变体。
    • @Eugene:我们所说的不只是运行时函数吗?如果在我的二进制文件中最终作为常量或静态数据的字符串是 Unicode,为什么所谓的“智能链接器”不丢弃那些在我的二进制文件中无用占用空间的函数?不过,我明白你的意思。我想 Unicode 的实现方式(并作为遗产继承)并没有让事情变得更好。
    【解决方案5】:

    这是因为一些泛型功能已添加到 sys 单元中。 2009 年添加了泛型,但在系统单元中,一些类在 xe 和 xe2 中用泛型重写。恕我直言

    添加此标志以减小 dpr 文件(项目>查看源代码)中的大小到每个单独的单元(从 XE5 开始)*。

    {$SETPEFlAGS IMAGE_FILE_DEBUG_STRIPPED or IMAGE_FILE_LINE_NUMS_STRIPPED or
     IMAGE_FILE_LOCAL_SYMS_STRIPPED OR IMAGE_FILE_RELOCS_STRIPPED}
    
    {$WEAKLINKRTTI ON}
    {$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
    

    (*) 请注意,as of XE5 and newer, this needs to be in each individual unit for which you want to disable RTTI. 在此之前(XE4 及以下)可能位于 DPR 文件中,并适用于项目中的所有单元。

    【讨论】:

      猜你喜欢
      • 2011-11-04
      • 1970-01-01
      • 2014-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      • 1970-01-01
      相关资源
      最近更新 更多