如何使用gcc -M作为自动依赖生成器

时间:2015-09-25 14:24:00

标签: c gcc makefile dependencies

我收到了有关代码审核的建议,以便使用-M选项系列与gcc生成自动依赖关系生成 问题是文档令我感到困惑,我还是不明白当我简单地将-M添加到CFLAGS时我应该如何使用它 而且我仍然几乎找不到任何差异我刚刚得到了 warning: main.o: linker input file unused because linking not done 我正在使用gcc 4.8.4

2 个答案:

答案 0 :(得分:2)

仅仅更改调用编译器的方式是不够的 - 您还必须更改Makefile以使用新生成的信息。

Paul Smith为make写了good guide to how to set up automatic dependency tracking

答案 1 :(得分:2)

对于不会干扰“干净”目标的全自动版本,请使用以下内容:

%.d: %.c Makefile
    $(CC) -MM -MT"$@ $(@:.d=.o)" -MF$@ $(CFLAGS) $(INCLUDES) $<

ifneq ($(MAKECMDGOALS),clean)
ifneq ($(MAKECMDGOALS),distclean)
-include $(OBJS:.o=.d)
endif
endif

这假设您有一个要在$(OBJS)中链接的目标文件列表。此处的-MT参数确保依赖项文件本身具有与目标文件相同的依赖项。没有它,生成的依赖文件将例如看起来像

foo.o: foo.c foo.h bar.h

但你想要

foo.o foo.d: foo.c foo.h bar.h

因此在更改源代码时也会重新创建依赖关系。

这种方法不会改变您创建目标文件的规则,在额外的编译器调用中会生成依赖关系。还有一些替代方案可以在一次运行中同时执行代码和依赖项生成。以上是我喜欢使用的内容。