为什么/何时需要“清洁”目标?

时间:2011-07-10 16:05:34

标签: makefile gnu-make

有时似乎没有构建新的可执行文件,即使我需要一个,但我不明白为什么。例如,当我更改Makefile时,但是已经存在可执行文件,并且当我执行'make'时它不会创建更新的可执行文件。

Makefiles的全部目的不是为了让我不再担心那些东西吗?

3 个答案:

答案 0 :(得分:8)

来自GNU make documentation

  

如果源文件或任何名为dependencies的头文件比目标文件更新,或者目标文件不存在,则必须重新编译。

它不会改变触发它的Makefile。

make clean删除在此期间创建的所有目标文件。 通常,部分重新编译并不重要,即只重新编译您更改的文件,最后将新创建的目标文件与预先存在的目标文件链接起来。但是,如果您想绝对安全,则应在再次运行make clean之前运行make

保留旧目标文件(即从不运行make clean)的示例可能会成为一个问题:假设您已经存在一个已经存在的目标文件,该文件要与某个库的1.0版链接。现在你更新你的机器,这将安装1.1版本,其中一些功能与功能1.0不兼容。但是,由于您的目标文件是在编译时期望先前版本,因此链接过程最终会失败。

答案 1 :(得分:1)

嗯,这是一个非常广泛的问题。通常,您可以编写一个makefile来跟踪所有依赖项(包括它自己的修改时间)。然而,这是非常重要的,并且错误可以爬网到您的makefile与任何其他代码相同。因此,有时候,当怀疑某些东西没有正确构建时,清理所有内容并重建更容易。

有许多other build tools,例如scons,它们可能比makefile更强大/自动。

答案 2 :(得分:1)

使分析成为Makefile中定义的依赖关系,并从中构建依赖关系图。

如果它检测到输出(二进制文件)需要的任何先决条件发生变化,则会重建 - 或者至少是已更改的部分。

因此,如果您的依赖项包含Makefile - 它可能不应该 - make会在您更改Makefile后更新二进制文件。

使用Makefiles的生活并不总是那么容易,但无论如何它都会对你有所帮助。