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

时间:2010-07-13 01:59:31

标签: delphi build compilation delphi-6

使用Delphi-6有两个选项:Build和Compile。

我知道当我运行程序时,它只编译已更改的文件,并将DCU用于那些没有更改的文件。当我点击构建时,它显然会重建DCU。

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

如果我没有完整构建会发生什么,是否有任何后果?

4 个答案:

答案 0 :(得分:25)

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

当源代码可用时,

构建会编译项目中所有已使用的单位。

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

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

答案 1 :(得分:15)

构建时,编译时?

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

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

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

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

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

  1. 一个是项目中单元的路径错误,或者工作目录错误时使用相对路径。 (见Delphi debug a wrong unit
  2. (我不完全确定这个,这是一个假设)。因为CRC(1)而重新编译.dcu,但新编译的dcu放在不同的目录中。这对于当前编译来说不是问题(因为已经加载了正确的dcu),但是在随后的编译(例如依赖包)中,再次找到旧的dcu文件,并且源不是 - >错误。 如有疑问,请通过递归删除所有DCU来清理您的构建目录
  3. 在.dpr
  4. 中提到的单位路径错误

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

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

    (3)与Delphi相反,FPC确实在.inc更改上重建。 FPC项目在内部大量使用.inc文件,这个更改已经存在于Delphi支持之前。 因此,将“define”inc文件复制到任何目录中的软件包将无法使用FPC进行编译,因为它们的大小和CRC通常略有不同。 Indy(10)就是一个很好的例子。

答案 2 :(得分:3)

更改设置时应始终构建。

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

答案 3 :(得分:2)

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

澄清可重复发布的重要性

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

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