重新编译其他 C 文件时,始终重新编译 version.c



每当其他 c 文件发生更改时,我想重新编译version.c。因此,每当其他 c 文件发生变化时,我都尝试触摸 c 文件。问题是make在进行c编译时无法识别更改。我认为原因是它已经更新了所有依赖项。有没有办法打破锁链?

例如:

$(TARGET): $(OBJECTFILES) $(TARGET).a
$(OBJECTDIR)/%.o: %.c | $(OBJECTDIR)
$(if $(filter $(VERSION_BUILD),0),$(shell touch $(PROJECT_ROOT_PFAD)/$(VERSION_FILE)))
#When VERSION_FILE then VERSION_BUILD is set to 1
$(CC).....

所以我想立即识别更新的文件。

每当其他 c 文件发生更改时,我想重新编译 version.c。

因此,您必须声明编译version.c的结果取决于其他 C 源文件。下面计算其他 C 源文件的列表并将其分配给 make 变量:

OTHER_C_SOURCES := $(filter-out version.c,$(wildcard *.c))

编译version.c的结果是version.o.因此,您需要的规则是:

version.o: version.c $(OTHER_C_SOURCES)
$(CC) -c $(CFLAGS) $< -o $@

就是这样。它说:如果version.c或任何其他源文件发生更改,请通过执行以下命令重建version.o

$(CC) -c $(CFLAGS)  version.c -o version.o

($<扩展为第一个先决条件 -version.c-$@作为目标 -version.o)。

注意:您使用的解决方案与正常的make策略相去甚远。您可能应该重新考虑所有这些,并将 Makefile 基于经典的target: pre-requisites依赖关系图。

你是在最后添加version.cOBJECTFILES,因为这完全取决于顺序。

fileA.c
version.c
fileB.c

如果在编译时触摸version.cfileA.cversion.c被重新编译,但在编译fileB.c时触摸version.c时不会,因为 version.c 已全部就绪。所以解决方案是:

fileA.c
fileB.c
...
version.c

最新更新