自动处理头文件的依赖关系
现在我们的Makefile写成这样: all: main main: main.o stack.o maze.o gcc $^ -o $@ main.o: main.h stack.h maze.h stack.o: stack.h main.h maze.o: maze.h main.h clean: -rm main *.o .PHONY: clean 按照惯例,用 $ gcc -M main.c main.o: main.c /usr/include/stdio.h /usr/include/features.h /usr/include/sys/cdefs.h /usr/include/bits/wordsize.h /usr/include/gnu/stubs.h /usr/include/gnu/stubs-32.h /usr/lib/gcc/i486-linux-gnu/4.3.2/include/stddef.h /usr/include/bits/types.h /usr/include/bits/typesizes.h /usr/include/libio.h /usr/include/_G_config.h /usr/include/wchar.h /usr/lib/gcc/i486-linux-gnu/4.3.2/include/stdarg.h /usr/include/bits/stdio_lim.h /usr/include/bits/sys_errlist.h main.h stack.h maze.h
$ gcc -MM *.c main.o: main.c main.h stack.h maze.h maze.o: maze.c maze.h main.h stack.o: stack.c stack.h main.h 接下来的问题是怎么把这些规则包含到Makefile中,GNU all: main main: main.o stack.o maze.o gcc $^ -o $@ clean: -rm main *.o .PHONY: clean sources = main.c stack.c maze.c include $(sources:.c=.d) %.d: %.c set -e; rm -f $@; $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; sed 's,($*).o[ :]*,1.o $@ :,g' < $@.$$$$ > $@; rm -f $@.$$$$
include main.d stack.d maze.d 类似于C语言的 $ make Makefile:13: main.d: No such file or directory Makefile:13: stack.d: No such file or directory Makefile:13: maze.d: No such file or directory set -e; rm -f maze.d; cc -MM maze.c > maze.d.$$; sed 's,(maze).o[ :]*,1.o maze.d :,g' < maze.d.$$ > maze.d; rm -f maze.d.$$ set -e; rm -f stack.d; cc -MM stack.c > stack.d.$$; sed 's,(stack).o[ :]*,1.o stack.d :,g' < stack.d.$$ > stack.d; rm -f stack.d.$$ set -e; rm -f main.d; cc -MM main.c > main.d.$$; sed 's,(main).o[ :]*,1.o main.d :,g' < main.d.$$ > main.d; rm -f main.d.$$ cc -c -o main.o main.c cc -c -o stack.o stack.c cc -c -o maze.o maze.c gcc main.o stack.o maze.o -o main 一开始找不到 set -e; rm -f maze.d; cc -MM maze.c > maze.d.$$; sed 's,g' < maze.d.$$ > maze.d; rm -f maze.d.$$ 注意,虽然在Makefile中这个命令写了四行,但其实是一条命令,
不管是Makefile本身还是被它包含的文件,只要有一个文件在 main.o main.d: main.c main.h stack.h maze.h maze.o maze.d: maze.c maze.h main.h stack.o stack.d: stack.c stack.h main.h 如果我在 1、 main.o: main.c main.h stack.h maze.h %.o: %.c # commands to execute (built-in): $(COMPILE.c) $(OUTPUT_OPTION) $< 第一条是把规则 main.d: main.c main.h stack.h maze.h %.d: %.c set -e; rm -f $@; $(CC) -MM $(CPPFLAGS) $< > $@.$$$$; sed 's,sans-serif; font-size:14px">因此 |