Delphi 重新编译RTL-如果可能,那么如何重新编译?

Delphi 重新编译RTL-如果可能,那么如何重新编译?,delphi,Delphi,我渴望做一些实验,修改Delphi运行时库(RTL)的底层,system.pas等等。。。有没有可能 我非常喜欢挑战,比如“是的,但是您必须为一些汇编程序向导提供自定义的.obj文件,因为它们从未随官方的Delphi源代码一起分发”。我很好,我只是想知道 我想用Delphi7做这个实验,但是任何其他版本的内部信息都可以。这是一家自石器时代就与德尔福合作的公司的福利之一 (我一直认为这是一个RTFM问题,答案是响亮的“否!”,但出于某种原因,谷歌不会确认。)您只能从命令行重新编译RTL。安装的RT

我渴望做一些实验,修改Delphi运行时库(RTL)的底层,
system.pas
等等。。。有没有可能

我非常喜欢挑战,比如“是的,但是您必须为一些汇编程序向导提供自定义的.obj文件,因为它们从未随官方的Delphi源代码一起分发”。我很好,我只是想知道

我想用Delphi7做这个实验,但是任何其他版本的内部信息都可以。这是一家自石器时代就与德尔福合作的公司的福利之一


(我一直认为这是一个RTFM问题,答案是响亮的“否!”,但出于某种原因,谷歌不会确认。)

您只能从命令行重新编译RTL。安装的RTL源目录中应该有一个makefile。它设计用于make.exe命令行实用程序,该实用程序应位于安装的“bin”文件夹中。我建议您将相关来源复制到单独的位置进行实验。我必须提醒您,系统单元与编译器紧密耦合,编译器期望许多函数具有特定的名称和特定的参数列表(如果有的话)。许多RTL“helper”函数没有任何正式声明的参数,但期望以某种方式传递参数


另一个注意事项是更改某些类、函数或类型的接口声明。这样做可能会导致与现有DCU文件和组件严重不兼容。因此,在将包含的RTL或第三方组件中的DCU文件与自定义修改版本混合时,必须非常小心。我建议您在进入界面破坏性更改的领域之前,只进行实施部分的更改。

您可以像任何其他单元一样重新编译RTL

对于System.pas,必须使用命令行编译器

例如,下面是一个工作批处理文件内容(有些命令行开关没有很好的文档记录):

这将重新编译System.pas和SysInit.pas(都是最低级别的RTL文件)

但为了使用重新创建的dcu文件,您必须将包含更新的dcu文件的文件夹放在IDE的第一个位置:例如,在Delphi7中,它是Option/Environment Options/Library,然后将文件夹放在“库路径”和“浏览路径”字段的第一位

也许删除Delphi安装目录中的原始.dcu文件是值得的

但请确保您不会更改单元的“接口”部分,否则您将在使用其他未修改的RTL单元(或第三方组件)进行编译时遇到问题。您可以更改“实现”部分、应用修复程序或重写某些部分以提高速度,但不要更改“接口”部分以避免任何链接错误

始终备份要更改的原始.pas和.dcu文件。进行一些自动编译测试是个好主意,这样您就可以确保对RTL的修改不会添加任何回归


为了提高低级RTL函数(主要是System.pas和SysUtils.pas)的速度,我们为我们的应用程序进行了这样的RTL重新编译。专为Delphi7和2007设计。对于较新的Delphi版本,您仍然可以使用相同的原则。

我记得有一次编译器也依赖于声明的顺序System.pas。自从我重新编译RTL已经很久了,所以这可能是在Turbo Pascal/Delphi 1(16位)时代。我们叫什么RTL?对于System.pas和SysInit.pas,只能从命令行执行。但对于其他更高级别的单元(如Classes.pas或SysUtils.pas),可以从IDE中完成,只需在IDE选项中更改较旧的库文件,并提供另一个.pas源,该源将代替默认版本使用。我记得Variants.pas即使没有更改也无法轻松重新编译。@Torbins AFAIR存在一些循环依赖性问题:要重新编译Variants.pas,必须按正确的顺序重新编译RTL文件。使用命令行编译器很容易做到这一点。如果您不使用variant,您可以提供一个无效的,并节省一些代码空间(这是KOL或我们的LVCL所做的)。@Allen我只是在修改System.Rtti.pas后使用了buildrtl.bat和release,但当我将dcu放入lib文件夹时,它告诉我F2051 Unit System。类是用不同版本的System.Rtti.TRttiContext编译的。我想buildrtl.bat版本使用的编译器选项与已发布的不同?感谢您的清晰编写,并以艰苦的经验为后盾。杰出的这是一个非常古老的问题/答案,但我可以确认,在Delphi10.3中,这仍然是一个有效的解决方案。谢谢
del *.dcu /s
"c:\program files\borland\delphi7\bin\dcc32.exe" -O+ -Q -M -Y -Z -$D+ System.pas