2011-07-10 70 views
6

有时看起来好像不是一个新的可执行文件,尽管我需要一个,但我不明白为什么。例如,当我更改Makefile时,但已经有一个可执行文件,并且当我执行'make'时,它不会创建更新的可执行文件。为什么/我什么时候需要一个'干净'的目标?

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

回答

6

GNU make documentation

重新编译必须在源文件中完成,或任何命名为依赖的头文件,是不是对象文件更近,或者如果目标文件不存在。

它不会改变触发它的Makefile。

make clean删除在此期间创建的所有对象文件。 通常,部分重新编译没什么大不了的,即只重新编译你改变的文件,最后把新创建的目标文件和预先存在的目标文件链接起来。但是,如果您想要绝对安全,则应该在运行make之前再次运行make clean

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

+0

我不相信你的榜样。如果对库的更新更改其接口,则无论如何您都必须更改代码,这会导致重新编译受影响的对象。所以不需要在那里“干净”。 – eriktous

+0

不一定 - 如果您正在处理的其他文件不依赖于特定的库,则不会重新编译受影响的对象。 – emboss

+0

如果任何对象与新库不兼容,则无论如何都应该更改它们的源以反映界面中的更改。做一个“干净的”不会让它消失,链接仍然会失败。 – eriktous

1

嗯,这是一个非常广泛的问题。通常,您可以编写一个makefile来跟踪所有的依赖关系(包括它自己的修改时间)。然而,这不是微不足道的,错误可以抓取到你的makefile,就像任何其他代码一样。因此,有时候更容易清理所有内容,并在怀疑某些内容未正确构建时重新构建。

有很多other build tools,如scons这可能比makefile更健壮/自动。

1

使分析成为Makefile中定义的依赖关系并从中创建一个依赖关系图。

如果它检测到输出(二进制文件)需要的任何前提条件发生更改,它将被重建 - 或者至少是已更改的部分。因此,如果您的依赖包含Makefiles - 它可能不应该 - make会在您更改Makefile后更新二进制文件。

Makefiles的生活并不总是那么容易,但无论如何,它可以帮助你。

相关问题