Delphi 中编译和构建有什么区别?

问题描述 投票:0回答:4

Delphi-6 有两个选项:构建和编译。

我知道当我运行一个程序时,它只会编译已更改的文件,并对未更改的文件使用 DCU。当我点击构建时,显然它会重建 DCU。

我一直想知道的是,当我制作一个要发布的程序(更改构建设置、条件变量等)时,我可以直接编译,还是必须进行完整构建?

如果我不进行完整构建会发生什么,有什么后果吗?

delphi build compilation delphi-6
4个回答
29
投票

@Daisetsu,这是构建和编译之间的区别。

Build 当源代码可用时编译项目中所有使用的单元。

编译仅编译更改的使用单位。

根据我个人的经验,当您更改编译器的配置时,必须执行应用程序的构建,以便更改将反映在项目的所有单元中。


21
投票

何时构建、何时编译?

编译器仅在 .pas 源文件的日期时间戳更改 (1,2) 时自动重新编译单元。

项目中的其他状态更改(指令、调试或其他编译器设置等)时,编译器不会自动重新编译。这就是您需要强制构建的时候。

当 .inc 或其他包含的 ($I) 文件更改(3) 时,您还需要强制重建,因为它们的日期时间戳未被检查。

总而言之,当除单位 .pas 文件之外的任何内容发生更改时,您需要进行构建。

建筑中存在一些奇怪的情况。大多数结果会导致 “找不到单位 xxx” 错误,而它似乎就在那里

  1. 一种是项目中单元的路径错误,或者工作目录错误时使用相对路径。 (参见Delphi调试错误的单元
  2. (我对此不太确定,这是一个假设)由于 CRC(1),.dcu 被重新编译,但新编译的 dcu 被放置在不同的目录中。这对于当前编译来说不是问题(因为已经加载了正确的 dcu),但在后续编译中(例如,项目组中的配置路径略有不同的依赖包)会再次找到旧的 dcu 文件,并且来源不是 -> 错误。 如有疑问,请始终通过递归删除所有 DCU 来清理构建目录
  3. .dpr 中提及的单位路径错误

(1) 如果 Delphi 就像 FPC,.dcu 包含它所依赖的所有 dcu 的接口部分的 CRC。这可以用来检查是否还需要重新编译。例如。由于文件系统操作(移动 dcu)

(2) 对于专家来说,也可以看看 {$implicitbuild xx}

(3) 与 Delphi 相反,FPC 会根据 .inc 更改进行重建。 FPC 项目在内部大量使用 .inc 文件,这一更改早在 Delphi 支持之前就已发生。 因此,将“defines”inc 文件复制到任何目录的包将无法使用 FPC 进行编译,因为它们的大小和 CRC 通常略有不同。印地 (10) 就是一个很好的例子。


3
投票

更改设置时应始终构建。

之前编译的 DCU 文件可能是使用不同的设置进行编译的,例如编译器定义。这可能会导致同一项目中的两个单元使用不同的设置进行编译。


3
投票

准备发布时,您应该肯定进行完整的构建。
没有理由不这样做,Delphi 的编译器足够快。

阐明可重复发布的重要性

  • 准备发布时,您将拥有其他人将使用的产品版本。
  • 如果他们报告问题,您可能需要返回到该版本来测试并修复问题。
  • 如果您没有进行完整的构建,而是依赖于现有的DCU,则有可能您的源文件之一没有被重新编译。
  • 即使这种可能性相当渺茫,这种机会也会严重妨碍您快速解决问题的能力。
  • 随着系统变得越来越大,相互依赖性越来越多,并且“野外支持”的版本越来越多,这个问题会变得更糟。

为了您自己的理智,我强烈建议您始终为可发布的版本进行完整构建。
即使对于不可发布的版本,我也会定期进行完整构建。

© www.soinside.com 2019 - 2024. All rights reserved.