我有这个Makefile:
all: src/exec
src/exec:
make -C src/
src/exec: src/bar.o
src/bar.o: src/bar.h
在src
目录中这些文件:
touch src/exec src/bar.o src/bar.h
当我点击make时,我得到了:
$ make
make: Nothing to be done for 'all'.
现在,如果我对src/bar.h
进行更改,我会得到相同的结果:
$ touch src/bar.h
$ make
make: Nothing to be done for 'all'.
我不明白。 Make应该遵循依赖链:
all <- src/exec <- src/bar.o <- src/bar.h
如果src/bar.h
将目标更改为正确重建?
当我使用*.d
或gcc -MM
生成的makedepend
个文件时,我注意到这些文件中的规则完全相同:
bar.o: bar.c bar.h
exec: bar.o foo.o
所以我想做的事情应该在某个时候起作用。我错了吗?
答案 0 :(得分:2)
既然你明确要求解释正在发生的事情,而不是对你要解决的问题有任何帮助,我会提供前者并忽略后者。
如果您使用make -d
并检查输出,您将很快看到会发生什么;这是一段摘录:
Finished prerequisites of target file 'src/bar.o'.
Prerequisite 'src/bar.h' is newer than target 'src/bar.o'.
No recipe for 'src/bar.o' and no prerequisites actually changed.
No need to remake target 'src/bar.o'.
Finished prerequisites of target file 'src/exec'.
Prerequisite 'src/bar.o' is older than target 'src/exec'.
No need to remake target 'src/exec'.
Finished prerequisites of target file 'all'.
因此,make看到bar.h
比bar.o
更新,但没有可用于构建bar.o
的配方,因此它不会对bar.o
执行任何操作。因此,请注意bar.o
的时间戳未发生变化,因此bar.o
并不比src/exec
更新,因此不会重建src/exec
。