先列出以下几条命令:
1. gcc -M c.c :打印出依赖,预处理结束就停止编译。
2. gcc -M -MF c.d c.c:把依赖写入文件c.d,预处理结束就停止编译。
3. gcc -c -o c.o c.c -MD -MF c.d:编译c.c输出目标文件为c.o, 并把把依赖写入文件c.d。
4. gcc -c -o c.o -Wp,-MD,c.d :与3等价。使用-Wp是仅传递参数给预处理阶段使用。
参数详解:
-M 不是输出预编译过程的结果,而是输出一个用于make的规则,该规则描述了这个源文件的依赖关系。预编译器输出的这个make规则包含名字与原文件相同的目标文件,冒号和所有include文件的名字。
-MM 与-M相似,只是不包含系统头文件
-MF file 将依赖关系写到文件file中
-MT target 重新定义目标对象名。默认的依赖目标名为% (编译生成的%.o)。
-MD/MMD 默认将生成的依赖文件写入%.d(编译生成的%.o)中。可以用-MF指定文件来覆盖。
示例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