Delphi-6 有两个选项:构建和编译。
我知道当我运行一个程序时,它只会编译已更改的文件,并对未更改的文件使用 DCU。当我点击构建时,显然它会重建 DCU。
我一直想知道的是,当我制作一个要发布的程序(更改构建设置、条件变量等)时,我可以直接编译,还是必须进行完整构建?
如果我不进行完整构建会发生什么,有什么后果吗?
@Daisetsu,这是构建和编译之间的区别。
Build 当源代码可用时编译项目中所有使用的单元。
编译仅编译更改的使用单位。
根据我个人的经验,当您更改编译器的配置时,必须执行应用程序的构建,以便更改将反映在项目的所有单元中。
何时构建、何时编译?
编译器仅在 .pas 源文件的日期时间戳更改 (1,2) 时自动重新编译单元。
项目中的其他状态更改(指令、调试或其他编译器设置等)时,编译器不会自动重新编译。这就是您需要强制构建的时候。
当 .inc 或其他包含的 ($I) 文件更改(3) 时,您还需要强制重建,因为它们的日期时间戳未被检查。
总而言之,当除单位 .pas 文件之外的任何内容发生更改时,您需要进行构建。
建筑中存在一些奇怪的情况。大多数结果会导致 “找不到单位 xxx” 错误,而它似乎就在那里
(1) 如果 Delphi 就像 FPC,.dcu 包含它所依赖的所有 dcu 的接口部分的 CRC。这可以用来检查是否还需要重新编译。例如。由于文件系统操作(移动 dcu)
(2) 对于专家来说,也可以看看 {$implicitbuild xx}
(3) 与 Delphi 相反,FPC 会根据 .inc 更改进行重建。 FPC 项目在内部大量使用 .inc 文件,这一更改早在 Delphi 支持之前就已发生。 因此,将“defines”inc 文件复制到任何目录的包将无法使用 FPC 进行编译,因为它们的大小和 CRC 通常略有不同。印地 (10) 就是一个很好的例子。
更改设置时应始终构建。
之前编译的 DCU 文件可能是使用不同的设置进行编译的,例如编译器定义。这可能会导致同一项目中的两个单元使用不同的设置进行编译。
准备发布时,您应该肯定进行完整的构建。
没有理由不这样做,Delphi 的编译器足够快。
为了您自己的理智,我强烈建议您始终为可发布的版本进行完整构建。
即使对于不可发布的版本,我也会定期进行完整构建。