在编译脚本中,我通常会在编译之前看到总是删除目标文件的调用。这会减慢构建过程吗?编译器是否真的有必要在决定重新编译它们时检查对象文件是否已过期?
答案 0 :(得分:4)
有时,如果将源文件还原为以前的版本,.o将具有其源的较新日期,因此不会被提供给编译器。如果您有理由还原源文件,那么您几乎肯定希望重建该对象。做一个干净的构建可以确保你得到你认为你得到的东西。
答案 1 :(得分:3)
1)是的,2)不,但不是编译器注意到它,它是构建系统(IDE或编写良好的makefile)。
答案 2 :(得分:3)
在某种程度上,删除现有的目标文件会破坏首先使用单独的翻译单元的目的。您的标准构建环境通常只应重建那些早于相应源文件的目标文件。 (您不需要删除,只能覆盖。)
如果你有一个不错的版本控制系统,那么即使签出旧版本的修改过的文件也会使磁盘上的实际文件有一个当前的时间戳,但实际上,如果你担心某些东西可能不一致,那么你可以随时清理整个构建树并重新开始。但是作为普通代码编写的问题,删除目标文件似乎非常浪费。
当然,您应该为每组构建选项保留一组目标文件(例如,debug vs release)。一些构建环境允许您拥有多个输出目录,其他(如cmake)将自动重建所有内容,如果您更改全局构建设置,但这是值得注意的,特别是如果您只是在编译器标志中添加一些#defines在构建过程的中间。