makefile 中的depend

Q:.depend dep: @for dir in $(SUBDIRS); do $(MAKE) -C $$dir ; done
A:C 源码的开头经常有一系列被包含的头文件,有一些是系统级的,有一些则是本地应用级:
例如:#include <stdio.h>
      #include "foo.h"int main(....
      要确定在foo.h 被改变之后,这个文件也会被重新编译, Makefile 这样写:
foo: foo.c foo.h
  当项目变得越来越大,本地头文件越来越多的时候,要追踪所有这些头文件和所有依赖它的文件会是一件痛苦的事情。如果改变了其中一个头文件,却忘了重新编译所有依赖它的源文件,结果你可以试试。
此时就可以使用depend ,就可只编译包含此头文件的源文件,可大大节省时间。

gcc 有一个选项可以分析你的源文件然后产生一个头文件的列表和它的依赖关系: -MM。如果把下面的内容加到Makefile 里面:
depend:    gcc -E -MM *.c > .depend
然后运行 make depend,就会产生一个 .depend,里面包含了目标文件,C 文件和头文件的列表:
foo.o: foo.c foo.h
如果改变了 foo.h,下一次运行 make 的时候,所有依赖 foo.h 的文件就会被重新编译。
每一次增加一个头文件的时候,做一次 make depend。
 
    一般来说,make其实是makeall的省略;make后面跟的是target,即你要编译的目标,在makefile里面会列出这个target依赖于哪几个别的target,别的target又依赖于另外的target,如此“递归”,最终会到依赖的源文件和头文件;当然,也有可能这个target后面直接就是源文件和头文件(最简单的情况)。make all和makedepend没有本质区别,都是生成某个目标,只是目标名称不同而已;至于编译的结果,就取决于makefile的写法,如果makefile中目标all和目标depend的依赖一样,那么结果也将是相同的。你前面列出的make 和makedepend的区别没有错,但那只是早些时候大家的约定熟成而已,你完全可以修改makefile,把他们的功能完全弄反。现阶段,很多软件已经不需要或者不支持make depend了,比如编译linux 2.6的时候,根本不需要make depend,而早期的linux2.4,则一般需要make depend这一步。


From: http://blog168.chinaunix.net/space.php?uid=25453433&do=blog&id=2168110

你可能感兴趣的:(c,linux,gcc,makefile)