手工编写依赖关系不仅工作量大而且极易出现遗漏,更新也很难及时,修改源或头文件后makefile可能忘记修改。为了解决这个问题,可以用 下面我们以一个简单的例子来说明如何自动生成依赖关系: exm/ main.c s.c s.h makefile文件内容如下: all:a src=$(wildcard *.c) obj:=$(patsubst %.c,%.o,$(src)) ifneq($(MAKECMDGOALS),clean) -include$(src:.c=.d) endif a:$(obj) gcc$(obj)-o $@ %.d:%.c set-e;rm -f $@; \ gcc-MM$(CPPFLAGS) $< > $@.$$$$; \ sed's,\($*\)\.o[:]*,\1.o $@ : ,g' < $@.$$$$ > $@; \ rm-f$@.$$$$ %.o:%.c @echo'Buildingfile: $<' @echo'Invoking:GCC C Compiler' gcc-O0-g3 -Wall -c -o "$@" "$<" @echo'Finishedbuilding: $<' @echo''
其中wildcard作用就是将指定目录下.c文件全部找出,所以这里src=main.cs.c patsubst作用是把$(src)中的.c全部换为.o,于是obj=main.os.o include$(src:.c=.d)相当于includemain.ds.d 由于此时这两个文件并不存在,所以会出现下面提示: makefile:6:main.d:没有那个文件或目录 makefile:6:s.d:没有那个文件或目录 如果不想要这个提示,可以将include替换为-include 尽管一开始找不到
3)$<依赖的目标集(即*.c),
-MM:表示生成文件依赖关系,$@:表示生成的目标文件(即*.d),$$:表示本身的ProcessID。注意,在Makefile中 4)这个 5)最后把临时文件删掉。
除了上面方法外,还可使用GCC的-MMD-MP -MF -MT选项,如下,可起到同样目的: all:a src=$(wildcard *.c) obj:=$(patsubst %.c,%.o,$(src)) ifneq($(MAKECMDGOALS),clean) -include$(src:.c=.d) endif a:$(obj) gcc$(obj)-o $@ %.o:%.c @echo'Buildingfile: $<' @echo'Invoking:GCC C Compiler' gcc-O0-g3 -Wall -c -fmessage-length=0 -MMD -MP-MF"$(@:%.o=%.d)"-MT"$(@:%.o=%.d)" -o "$@""$<" @echo'Finishedbuilding: $<' @echo''
|
|
来自: lifei_szdz > 《Makefile编程》