在程序开发时,Makefile有时也不断进行更改.更改后进行make时,由于make本能的反应只是检查与目标相关联的文件是不是应该更新,而不检查Makefile自己是否改变过.这样,当只对Makefile做了更改而没有对与目标相关联的程序文件做任何更改时,make就不工作,必须得把其中至少一个程序文件"更改"一下写回磁盘后才能重新编译.
例如,有以Makefile文件内容如下:
my_exe_file: a.o b.o
cc -o my_exe_file a.o b.o
a.o: a.c a.h
cc -c a.c a.h
b.o: b.c b.h
cc -c b.c b.h
.PHONY: clean
clean:
rm *.o
rm my_exe_file
则如果没有对程序文件a.c, b.c, a.h, b.h做任何改变,但是忽然想把Makefile中加入调试选项,只修改了Makefile文件如下:
my_exe_file: a.o b.o
cc -o my_exe_file a.o b.o -g
a.o: a.c a.h
cc -c a.c a.h -g
b.o: b.c b.h
cc -c b.c b.h -g
.PHONY: clean
clean:
rm *.o
rm my_exe_file
然后重新运行make,发现提示:
make:'my_exe_file" is up to date.
这时,不得不重新把至少一个程序文件重新往磁盘写一遍,或者更改点什么内容才能让make重新编译.但是还得让所有受Makefile修改影响的目标文件重新编译,所以要么得先make clean,要么就得将所有被需要重新编译的目标文件所依赖的文件都保存一次.
解决办法是在每个目标后面增加对Makefile的依赖.可以简单地添加一个*.o:Makefile,然后在第一个目标后面再加上Makefile.修改后的Makefile如下:
my_exe_file: a.o b.o Makefile
cc -o my_exe_file a.o b.o -g
a.o: a.c a.h
cc -c a.c a.h -g
b.o: b.c b.h
cc -c b.c b.h -g
*.o: Makefile
.PHONY: clean
clean:
rm *.o
rm my_exe_file
这样,以后无论对哪个程序文件进行修改,或者即使只对Makefile进行了修改,也会引起make对所有文件重新编译.