我收到了有关代码审核的建议,以便使用-M
选项系列与gcc
生成自动依赖关系生成
问题是文档令我感到困惑,我还是不明白当我简单地将-M添加到CFLAGS时我应该如何使用它
而且我仍然几乎找不到任何差异我刚刚得到了
warning: main.o: linker input file unused because linking not done
我正在使用gcc 4.8.4
答案 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
因此在更改源代码时也会重新创建依赖关系。
这种方法不会改变您创建目标文件的规则,在额外的编译器调用中会生成依赖关系。还有一些替代方案可以在一次运行中同时执行代码和依赖项生成。以上是我喜欢使用的内容。