如何使用 gcc -M 作为自动依赖生成器
how to use gcc -M for autodependency generator
我得到了关于代码审查的建议,使用 -M
选项系列和 gcc
来生成自动依赖生成
问题是文档让我感到困惑,我仍然不明白当我简单地将 -M 添加到 CFLAGS 时我应该如何使用它
我仍然几乎找不到任何区别我刚得到
warning: main.o: linker input file unused because linking not done
我正在使用 gcc 4.8.4
仅更改调用编译器的方式是不够的——您还必须更改 Makefile 以使用新生成的信息。
Paul Smith 为 make 写了一个 good guide to how to set up automatic dependency tracking。
对于不干扰 "clean" 目标的全自动版本,请使用如下内容:
%.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
因此当您更改源时也会重新创建依赖项。
这种方案不会改变您创建目标文件的规则,依赖项是在额外的编译器调用中生成的。还有一些替代方案可以在单个 运行 中同时生成代码和依赖项。以上是我喜欢用的
我得到了关于代码审查的建议,使用 -M
选项系列和 gcc
来生成自动依赖生成
问题是文档让我感到困惑,我仍然不明白当我简单地将 -M 添加到 CFLAGS 时我应该如何使用它
我仍然几乎找不到任何区别我刚得到
warning: main.o: linker input file unused because linking not done
我正在使用 gcc 4.8.4
仅更改调用编译器的方式是不够的——您还必须更改 Makefile 以使用新生成的信息。
Paul Smith 为 make 写了一个 good guide to how to set up automatic dependency tracking。
对于不干扰 "clean" 目标的全自动版本,请使用如下内容:
%.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
因此当您更改源时也会重新创建依赖项。
这种方案不会改变您创建目标文件的规则,依赖项是在额外的编译器调用中生成的。还有一些替代方案可以在单个 运行 中同时生成代码和依赖项。以上是我喜欢用的