zoukankan      html  css  js  c++  java
  • 减小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: ortti目录,在它下面建一子目录delphi2010,完成后目录如下:c: orttidelphi2010。

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

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

    @echo off

    del unitlist.inc

    dir /b "C:Program FilesEmbarcaderoRAD Studio7.0sourceWin32vcl*.pas" >> unitlist.inc

    dir /b "C:Program FilesEmbarcaderoRAD Studio7.0sourceWin32 tlwin*.pas" >> unitlist.inc

    dir /b "C:Program FilesEmbarcaderoRAD Studio7.0sourceWin32 tlcommon*.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就会更小了

  • 相关阅读:
    Android开发之旅1:环境搭建及HelloWorld
    程序员学习视频教程汇总
    Maven项目下update maven后Eclipse报错:java.lang.ClassNotFoundException: ContextLoaderL
    查看控制层从前端传来的参数
    PostMethod和GetMethod用法
    @Transient的用法和格式化页面展示的数据格式
    修改hosts
    javascript:history.go(-1)的使用
    JsonConfig的jsonConfig.setExcludes的用法
    验证登录超时,在登录后跳转超时时的页面
  • 原文地址:https://www.cnblogs.com/h2zZhou/p/5507547.html
Copyright © 2011-2022 走看看