【问题标题】:Compiling multiple units in a single DCU在单个 DCU 中编译多个单元
【发布时间】:2012-11-08 20:26:56
【问题描述】:

来自 .NET 背景,现在使用 Delphi。在 .NET 中,我曾经有一个单独的库项目,其中许多类被分成不同的文件。当我编译这个项目时,我得到了一个 DLL 文件。

但是,我无法在 Delphi 中做到这一点。我有很多类,每个类都在他们自己的文件中,有自己的单位名称(我没有找到一种方法让多个文件具有相同的单位名称)。当我编译我的项目时,我的项目中的每个单元都有一个 DCU 文件(我相信这相当于一个 .NET DLL?)。

问题是我不想拥有那么多文件!我希望我的所有课程都在不同的单元中只有一个 DCU 文件。有没有办法实现我想做的事情?您如何处理这些 DCU?

【问题讨论】:

  • 不要介意 dcus。将鼠标悬停在您问题上的“dcu”标签上以了解它是什么。
  • 所以你是说这些文件没用?当我想在另一个项目中使用我的自定义组件时会发生什么?我想我需要那个 dcu 文件。
  • 它们不是没用的,编译器需要/产生它们。您将组件安装到 package (link) 中。
  • 只要源文件存在,dcus的存在只会帮助减少编译时间。
  • 是的,你的团队几乎肯定做错了。

标签: delphi dll dcu


【解决方案1】:

.DCU(Delphi 编译单元)文件是在编译源(文本)和链接可执行文件之间使用的二进制文件。它们由编译器创建,在内存中连接在一起,与启动代码组合并由链接器放入实际的可执行文件(.EXE/.DLL/.BPL)中。

.DCU 文件不是 .DLL(动态链接库)文件,尽管 Delphi 可以组合一个或多个 .dcu 文件并链接到 .DLL

.dcu 文件的数量大多数时候是没有意义的;这是您需要关注的 .pas 源文件,您创建的每个源单元都有一个。如果源文件发生更改,它们将根据需要重新创建,或者如果源文件没有更改链接速度,则在其编译状态下使用它们。在您的 uses 子句中,每个 .pas 文件总是有一个 .dcu 文件,另外还有一个用于编译您自己的源代码。

当你在 IDE 的 Component Palette 中安装一个组件时,.dcu 被放置在一个 .BPL(Borland 包库)中,这是一种特殊类型的 DLL;然后将该 BPL 或包文件作为执行代码加载到 IDE 中。这就是设计时按钮在表单上的视觉显示方式;在 BPL 中执行的代码实际上创建了一个按钮,并允许它在表单编辑器中显示和操作。

当您构建可执行文件(并且不使用运行时包)时,DCU 文件将链接到您的应用程序中,一旦创建可执行文件 (.EXE) 文件,原始 .pas 文件或 .dcu 都不会不再需要。 (直到,也就是你需要对可执行文件进行修改,这种情况下.pas文件被修改,编译器创建一个新的.dcu,链接器将它们组合起来创建一个新的.exe。)

【讨论】:

  • 好的,我想我会忍受它并忽略这些文件。
  • 如果您购买没有源代码的第三方组件,您经常会得到 dcu 文件。请记住,它们通常在编译器版本中没有用,因此永远不要让自己陷入这种情况。
  • 如果您有源代码,则无需将 .DCU 文件检查到 SVN 中,顺便说一句。只需检查源文件;检查它们并重新编译它们将再次创建 .DCU,并且版本控制文本源文件要容易得多(并且在 repo 中占用更少的空间)。如果您也将 .dpr 和 .dproj 文件保存在 SVN 中,它会存储编译器设置,因此可以使用完全相同的设置重新生成 .dcu。如果你有没有源的第三方组件,你必须保存 DCU,但你不应该允许这种情况发生,正如@LURD 在上面的评论中所说的那样。
【解决方案2】:

.DCU 文件是开发过程中使用的中间文件。

.DCU 文件不随最终可执行的 .EXE 文件一起提供

是的,它可以用 Delphi 构建一个 .DLL 并让一个(Delphi 制造的).EXE 使用它。如果遵循某些约定,常规 C/C++ .EXE 也可以使用 Delphi .DLL。

如果您想将一组过程/类发送到库中,可以制作 .DLL 或(更接近 Delphi 原生的).BPL。

每次修改和重新编译 .PAS 文件时,它对应的 .DCU 文件也会重新生成。

在某些开发环境中,当开发人员不想公开源代码时,会向开发人员提供 .DCU 文件而不是源 .PAS 文件。

【讨论】:

    猜你喜欢
    • 2016-06-22
    • 1970-01-01
    • 2021-05-25
    • 2023-03-11
    • 1970-01-01
    • 2017-08-10
    • 2015-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多