自动预要求的一个常见的Makefile,看起来像:
SRCS := $(wildcard *.c)
OBJS := $(SRCS:%.c=%.o)
DEPS := $(OBJS:%.o=%.d)
$(OBJS): %.o: %.c
$(CC) $(CFLAGS) -c -o $@ $<
include $(DEPS)
$(DEPS): %.d: %.c
xxx
第一次,构建好的,生成的.d文件是这样的:
config.o config.d: config.c config.h
然后我将config.h重命名为config2.h,并修改config.c:
-#include "config.h"
+#include "config2.h"
再次制作,生成文件生成错误:
make[1]: *** 没有规则来制作目标 'config.h','config.d' 需要
因为 config.d 依赖于 config.h,我如何修改我的 Makefile 来解决此重命名问题。
真的很简单。您的.d
文件需要以下附加行:
config.h:
现在,当发现config.h
不存在时, 它将运行不存在的配方,并愉快地相信它已经创造了config.h
。然后它继续。
手册说:
如果规则没有先决条件或配方,并且规则的目标是不存在的文件,则假设只要运行其规则,此目标就会更新。
我们如何获得这条额外的线?
过去,您会在新创建的.d
文件上运行 perl 单行代码。如今,对于现代gcc变体,只需将-MP
添加到编译器命令行即可。
-MP 此选项指示 CPP 为每个依赖项添加主文件以外的虚假目标,导致每个依赖项都不依赖于任何依赖项。 这些虚拟规则可以解决错误,如果您删除头文件而不更新 Makefile 以匹配。
约伯是一个很好的'un。