GNU Make:如果重命名头文件,则自动先决条件不起作用



自动预要求的一个常见的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。

最新更新