Makefile实例
对依赖进行改进
gcc -M c.c // 打印出依赖
gcc -M -MF c.d c.c // 把依赖写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d // 编译c.o, 把依赖写入文件c.d
修改Makefile如下:
objs = a.o b.o c.o
dep_files := $(patsubst %, .%.d, $(objs))
dep_files := $(wildcard $(dep_files))
test: $(objs)
gcc -o test $^
ifneq ($(dep_files), )
include $(dep_files)
endif
%.o: %.c
gcc -c -o $@ $< -MD -MF .$@.d
clean:
rm *.o test
distclean:
rm $(dep_files)
.PHONY: clean
- 首先用obj变量将.o文件放在一块。
- 利用函数,把obj里面所有的文件都变为
.%.d
格式,并用变量 dep_files表示。 - 利用
wildcard
函数,判断dep_files
是否存在。 - 然后目标test依赖所有的
.o
文件。 - 如果dep_files变量不为空,就将其包含进来。
- 然后就是所有的.o文件都依赖.c文件,且通过-MD -MF生成.d依赖文件。
- 清理所有的.o文件和目标文件
- 清理依赖.d文件。
CFLAGS
工作中,我们希望把警告也当成错误来处理
CFLAGS = -Werror -Iinclude
…………
%.o : %.c
gcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d
除了编译参数-Werror,还可以加上-I参数,指定头文件路径,-Iinclude表示当前的inclue文件夹下。
此时就可以把c.c文件里的#include ".h"
改为#include <c.h>
,前者表示当前目录,后者表示编译器指定的路径和GCC路径。