我正在努力将一个旧项目从Delphi 2007迁移到Delphi 2010.我发现有一件事是生成的可执行文件的大小增加了一倍以上,并且原始版本已经很大了。 (超过50 MB。)我怀疑它与扩展的RTTI有很大关系。
由于该项目早于Delphi 2010,因此它不会在任何地方使用扩展RTTI,我希望保守包含它。有没有办法使用“项目选项”对话框将{$RTTI EXPLICIT METHODS([]) PROPERTIES([]) FIELDS([])}
全局设置为默认值?我原本预计会有一个选项(和$WEAKLINKRTTI
),但是我没有看到它们。
有没有人知道是否可以通过“传递给编译器的附加选项”字段或其他方式完成此操作?我真的不想在项目中的每一个单元都添加一个包含文件,因为有几千个...
答案 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,因此这是完成整个项目的最简单方法。