Delphi-6 有两个选项:构建和编译。
我知道当我运行一个程序时,它只编译已更改的文件,并将 DCU 用于未更改的文件。当我显然单击构建时,它会重建 DCU。
我一直想知道的是,当我制作一个发布程序(更改构建设置、条件变量等)时,我可以只编译,还是必须进行完整构建?
如果我不进行完整构建会发生什么,有什么后果吗?
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 通常略有不同。Indy (10) 就是一个很好的例子。
更改设置时应始终构建。
之前编译的 DCU 文件可能已使用不同的设置进行编译,例如编译器定义。这可能导致同一项目中的两个单元使用不同的设置进行编译。
在准备发布时,您当然应该进行完整的构建。
没有理由不这样做,Delphi 的编译器足够快。
For your own sanity, I strongly urge that you always do full build for a releasable version.
I regularly do full builds even for non-releasable versions.