使用Delphi-6有两个选项:构建和编译。
我知道运行程序时只会编译已更改的文件并对未更改的文件使用DCU。 当我点击“构建”时,它会重新构建DCU。
我一直在想,当我制作一个发布的程序(更改构建设置、条件变量等)时,我是否只需要编译,还是必须进行完整的构建?
如果我不进行完整的构建,会有什么后果吗?
使用Delphi-6有两个选项:构建和编译。
我知道运行程序时只会编译已更改的文件并对未更改的文件使用DCU。 当我点击“构建”时,它会重新构建DCU。
我一直在想,当我制作一个发布的程序(更改构建设置、条件变量等)时,我是否只需要编译,还是必须进行完整的构建?
如果我不进行完整的构建,会有什么后果吗?
@Daisetsu,以下是“构建”和“编译”的区别:
构建会在源代码可用时编译项目中的所有被使用单元。
编译仅编译已更改的被使用单元。
根据我的个人经验,当您更改编译器配置时,必须执行应用程序的构建操作,以便更改将反映在项目的所有单元中。
何时进行构建(build),何时进行编译(compile)?
当且仅当 .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。Indy(10)是一个很好的例子。
当更改设置时,您应该始终进行构建。
以前编译的DCU文件可能使用不同的设置进行编译,例如编译器定义。这可能会导致同一项目中的两个单元使用不同的设置进行编译。