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

转载 2012年03月30日 01:09:01
自从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就会更小了。

关闭RTTI,减小Delphi2010程序的尺寸

自从Delphi2010增强了RTTI反射机制后,编译出来的程序变得更大了,这是因为默认情况下 Delphi2010 给所有类都加上了RTTI信息(呵呵,不管你用不用它,好像实用价值确实不高,至少目前...
  • nhconch
  • nhconch
  • 2013年04月16日 14:17
  • 1836

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

====================================================== 注:本文源代码点此下载 =============================...
  • javazhuanzai
  • javazhuanzai
  • 2012年01月15日 04:01
  • 151

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

关闭RTTI反射机制,减小Delphi2010程序的尺寸
  • shuaihj
  • shuaihj
  • 2011年01月09日 20:45
  • 3603

Delphi2010的RTTI增强

Delphi编译的文件体积增大了很多.很大一部分原因是因为Delphi2010默认提供了全信息的RTTI.每一个数据类型都有全部运行时信息.例如可以在运行时获得结构体的成员以及成员类型等.这个功能带来...
  • wr960204
  • wr960204
  • 2009年09月23日 15:27
  • 5391

整理: RTTI的设置, 含义, 用途

RTTI没有设置, 会使多态时强转过来的类指针没有指到正确的类, 引起程序崩溃. 因为和代码无关, 初看起来有些奇怪.RTTI的设置: 以vs6和vs2010为例RTTI含义n programming...
  • LostSpeed
  • LostSpeed
  • 2011年02月01日 14:39
  • 1930

关闭Delphi 2010 RTTI的方法

今日见到的,虽然未用上D2010不过先记录下来。扩充的RTTI信息将使编译生成的文件大小巨幅增大,而如下是关闭RTTI的方法:There are some options which reduce t...
  • nhconch
  • nhconch
  • 2009年09月02日 18:16
  • 2874

减少可执行程序的大小

一、背景 可执行程序需要链接一些静态库,但是静态库中的函数并没有全部使用,只用了其中的几个,但是系统默认会自动把整个静态库全部链接到可执行程序中,造成可执行程序的大小大大增加,浪费了...
  • CodeHeng
  • CodeHeng
  • 2016年07月01日 16:35
  • 1433

VC6启用"运行时类型识别" (RTTI)

在程序中,当我们对多态类的基类指针使用typeid,就可以在运行时确定指针指向对象的实际类型,并输出对象类型的名字。 #include   cstdlib >  #include   iostrea...
  • JoeBlackzqq
  • JoeBlackzqq
  • 2013年07月09日 14:40
  • 2081

Delphi RTTI(运行时类型信息)

如何根据名称找到控件如何根据名称找到对应的属性如何根据名称执行某个方法或事件 运行时类型信(以下简称RTTI)是在运行时保存和检索对象和数据类型的手段.通过RTTI我们可以了解正在使用的对象或组件的...
  • lailai186
  • lailai186
  • 2013年04月19日 13:21
  • 1585

减小静态库的大小

编译生成的.a文件太大,但又没有冗余的文件可以删除已减少体积,找了很久才找到解决办法,如下: Build Settings-->Generate Debug Symbols 将值设为NO...
  • cafei111
  • cafei111
  • 2014年12月19日 11:19
  • 1163
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:减小Delphi2010程序的尺寸(关闭RTTI反射机制)
举报原因:
原因补充:

(最多只允许输入30个字)