Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 什么是Delphi DCU文件?_C++_C_Delphi_Compilation_Dcu - Fatal编程技术网

C++ 什么是Delphi DCU文件?

C++ 什么是Delphi DCU文件?,c++,c,delphi,compilation,dcu,C++,C,Delphi,Compilation,Dcu,什么是Delphi DCU文件 我相信它代表“Delphi编译单元”。我是否正确地假设它包含目标代码,因此对应于从C/C++源代码文件编译的“.o”文件?我相信.dcu通常意味着“Delphi编译单元”,而不是.pas文件,它只是“Pascal源代码” .dcu文件是DCC编译器编译.pas文件后生成的文件(.dfm文件转换为二进制资源,然后由链接器直接处理) 它类似于其他编译器生成的和文件,但包含有关符号的更多信息(因此可以省略注释和编译器指令) 从技术上讲,一个.dcu文件不是一个“缓存”文

什么是Delphi DCU文件


我相信它代表“Delphi编译单元”。我是否正确地假设它包含目标代码,因此对应于从C/C++源代码文件编译的“.o”文件?

我相信.dcu通常意味着“Delphi编译单元”,而不是.pas文件,它只是“Pascal源代码”

.dcu文件是DCC编译器编译.pas文件后生成的文件(.dfm文件转换为二进制资源,然后由链接器直接处理)

它类似于其他编译器生成的和文件,但包含有关符号的更多信息(因此可以省略注释和编译器指令)

从技术上讲,一个.dcu文件不是一个“缓存”文件,尽管如果不删除它们,并且不需要重新编译它们,构建将运行得更快。.dcu文件绑定到生成它的编译器版本。从这个意义上讲,它的可移植性不如.o或.obj文件(尽管它们也存在兼容性问题)

这里有一些历史记录,以防有所增加。 编译器传统上将源代码语言翻译成某种中间形式。解释器不会这样做——他们只是直接解释语言并立即运行应用程序。BASIC是解释语言的经典示例。DOS和Windows中的“命令行”有一种语言,可以写入扩展名为.bat的文件“”中。但是在命令行中输入东西会直接执行它们。在*nix环境中,有许多不同的命令行解释器(),例如。您可以从所有这些文件中创建批处理文件——这通常被称为“脚本语言”。但是现在有很多其他语言都是经过解释和编译的

无论如何,例如,编译成一种称为“中间”表示的东西

最初是,和(源于PolyPascal)-和的不同版本-直接生成了在这些操作系统下运行的二进制可执行文件()

Pascal最初设计为一种小型高效的语言,旨在鼓励使用结构化编程和数据结构化的良好编程实践;最初设计为一个内置非常快速的编译器,在DOS和CP/M市场上是一个价格合理的竞争对手,当时的编辑/编译/链接周期很长。Turbo-Pascal和Pascal与当时的任何编程环境都有类似的限制:内存和磁盘空间的测量单位为,处理器速度的测量单位为

链接到可执行二进制文件会阻止您链接到单独编译的单元和库

在Turbo Pascal之前,有一种操作系统(支持多种语言,包括Pascal。当时的UCSD Pascal编译器已经用单元扩展了Pascal语言),它编译成伪机器字节码(称为p代码)格式,允许将多个单元连接在一起。虽然很慢

同时,它在和环境中发展,并编译成.o文件,这意味着“目标代码”而不是“源代码”。注意:这与我们今天所说的“完全无关”

Turbo Pascal版本3之前(包括版本3)直接生成的.com二进制输出文件(尽管您可以使用修改这些覆盖文件),并且从版本4起,支持将代码分成单元,这些单元在链接到最终可执行二进制文件之前先编译成.tpu文件。Turbo C编译器生成.Obj[Objcode ]文件(而不是字节码),Delphi 2介绍.Objo文件生成,以便与C++ Builder协作。 对象文件在每个单元内使用相对寻址,需要稍后进行所谓的“修复”(或)以使其运行。修复指向预期存在于其他对象文件或库中的符号标签

有两种“修复”:一种是通过名为“”的工具静态完成的。链接器获取一组对象文件,并将它们缝合在一起,形成类似于拼凑棉被的东西。然后,它通过插入指向所有外部定义标签的指针来“修复”所有相对引用

第二次修复是在程序加载运行时动态完成的。它们是由一种叫做“加载器”的东西完成的,但你永远看不到。在命令行中键入命令时,将调用将EXE文件加载到内存中,根据文件加载的位置修复其余链接,然后将控制权转移到应用程序的入口点

因此,当Borland在Turbo Pascal中引入单位时,.dcu文件起源于.tpu文件,然后随着Delphi的引入,扩展名发生了变化。它们与.obj文件非常不同,不过您可以从Turbo Pascal和Delphi链接到.obj文件


Delphi还完全隐藏了链接器,所以您只需进行编译和运行。但是,在Delphi的一个选项窗格中,所有链接器设置仍然存在。

除了David Schwartz的答案之外,还有一种情况是dcu实际上与用其他语言生成的典型obj文件有很大不同:泛型类型定义。如果在Delphi单元中定义了泛型类型,编译器会将此代码编译为语法树表示,而不是机器代码。然后,该语法树表示形式存储在dcu文件中。当泛型类型在另一个单元中使用和实例化时,编译器将使用此表示,并使用泛型类型将其与单元的语法树“合并”。您可以认为这在某种程度上类似于方法内联。顺便说一句,这也是为什么大量使用泛型的单元需要更长时间来编译的原因,尽管泛型类型是从dcu文件“链接进来”的

Delphi编译单元包含目标代码和预编译头,因此在某种程度上可以与obj文件和.pch进行比较