关闭RTTI反射机制,减小Delphi2010程序的尺寸

简介: 自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前我不会去用的)。虽说对程序的运行速度影响不大,但会增加安装程序的大小,这也是我们不愿看到的。有没有办法禁用RTTI信息,从而减小编译后程序的大小呢?,从文档中我们找到了方法。


一、在工程中用编译指令禁用RTTI


禁用的方法很简单,就是要在工程(dpr文件中。Delphi2010下项目文件是dproj文件,但dpr文件仍然是默认的编写代码的项目文件)的Uses语句前添加下面的定义就可以了:

{ Reduce EXE size by disabling as much of RTTI as possible (delphi 2009/2010) }

{$IF CompilerVersion >= 21.0}

{$WEAKLINKRTTI ON}

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

{$IFEND}


OK,这样重新编译后你会发现,确实把EXE文件大小减小了,但这还不够,请继续往下看。


二、重建无RTTI信息的VCL/RTL


下面我们进行关键的操作,因为VCL和RTL单元还是带RTTI信息的,我们要把它们的RTTI信息去掉。打开delphi2010新建一个工程,并保存,这里我们为方便讨论,把它保存到c:/nortti目录,在它下面建一子目录delphi2010,完成后目录如下:c:/nortti/delphi2010。

在DPR的uses段中添加所有使用到的VCL/RTL单元,呵呵,这样可能会很乱,所以我把所有单元名放到一个包含文件中去了(.INC文件),引用一下就可以了(注意,这里是所有单元名,真正使用时你只需保留用到的单元名),然后单击project菜单中的options项,编辑Unit output directory项的值为 c:/nortti/delphi2010。编译该项目,如果有错误提示,就删除那些单元引用。(注:当JPEG单元重建时你需要拷贝Source/Win32/vcl/Imaging/JPGImage/obj目录下的文件到你项目的目录),编译完成后关闭项目。

提示:可以用下面这个批处理文件产生上面说的单元列表

@echo off

del unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/vcl/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/win/*.pas" >> unitlist.inc

dir /b "C:/Program Files/Embarcadero/RAD Studio/7.0/source/Win32/rtl/common/*.pas" >> unitlist.inc


rem Manually add some system units (we cannot add the entire dir or problems crop up)

echo SysUtils.pas >> unitlist.inc

echo Types.pas >> unitlist.inc

echo Variants.pas >> unitlist.inc

echo VarUtils.pas >> unitlist.inc

然后打开生成的unitlist.in文件,查找并替换所有的?.pas?为?,?。

呵呵,说了这么多,大家有点晕吧,还好,作者提供了一个项目,http://www.zipplet.co.uk/getfile.php/rttidisable.zip,大家下载下来后,修改一下就可以直接用,记得要修改输出目录哟!


三、在工程中使用新生成的单元


打开delphi2010,修改全局单元查找路径,因为编译器总是按顺序查找单元,我们修改后让它去使用我们重建的单元。

Tool菜单 -> Options 菜单, 浏览 Environment Options -> Delphi Options -> Library - Win32。在Library path最前面添加我们重建单元的完整路径。

这样做后,新建工程就会自动使用我们重建的无RTTI的单元了。最后别忘了在DPR工程中使用编译指令禁用RTTI哟!

各位可以自己比较一下编译后的文件大小,还是很明显的,另外大家还可以用upx、aspack压缩一下,那样EXE就会更小了。

 

本文来自Delphi园地,转载请标明出处:http://www.delphifans.com/infoView/Article_6493.html

相关文章
|
4月前
|
Java API 编译器
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
Java编译器注解运行和自动生成代码问题之编译时通过参数设置选项值问题如何解决
|
编译器 C++
2022 VS编译器如何实现监视
2022 VS编译器如何实现监视
|
安全 编译器 C++
C++实用技巧分享,控制对象创建
C++实用技巧分享,控制对象创建
|
小程序
小程序 onLaunch 参数差别
小程序 onLaunch 参数差别
531 0
小程序 onLaunch 参数差别
【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
236 0
【Groovy】MOP 元对象协议与元编程 ( 方法合成 | 动态注入方法 )
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
174 0
Qt [GC9-8]:让我们的程序可以随意的移动(重载鼠标事件)
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)
534 0
MFC双缓冲+提升绘图效率方法(号称三缓冲):自定义静态背景不频繁擦除(★firecat推荐★)
|
Java 图形学
Java中用双缓冲技术消除闪烁
在Java编写具有连贯变化的窗口程序时,通常的办法是在子类中覆盖父类的paint(Graphics)方法,在方法中使用GUI函数实现窗口重绘的过程。连贯变换的窗口会不断地调用update(Graphics)函数,该函数自动的调用paint(Graphics)函数。
1207 0