我有一个用GCC编译的庞大项目。 我知道通常预先构建应该重建所有不最新的依赖项,但我们更改的一些 .h 文件不会导致重建使用它们的文件。 make文件的层次结构,主make文件根据需要包含所需的make文件。 有没有办法确保重建文件" #include"最近修改过.h文件?
答案 0 :(得分:1)
您必须确保在先决条件中正确列出了头文件。对于大型项目,手动执行此操作是不可行的,但gcc
(或clang
)和GNU Make的组合为您提供了一种强大的自动化方法。
假设您使用模式规则有一些非常标准的Makefile:
CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -pedantic
OBJS := main.o module.o
all: program
program: $(OBJS)
$(CC) -o$@ $^
%.o: %.c
$(CC) -c $(CFLAGS) -o$@ $<
clean:
rm -f *.o
.PHONY: all clean
然后,您可以使用自动重新生成GNU Make的Makefile功能来包含添加gcc
生成的其他先决条件的文件:
CC := gcc
CFLAGS := -std=c11 -Wall -Wextra -pedantic
OBJS := main.o module.o
all: program
program: $(OBJS)
$(CC) -o$@ $^
# rule to create "dependency files", make the dependency file itself
# depend on the same prerequisites
%.d: %.c
$(CC) -MM -MT"$@ $(@:.d=.o)" -MF$@ $(CFLAGS) $<
# include dependency files except for targets not building anything
ifneq ($(filter-out clean,$(MAKECMDGOALS)),)
-include $(OBJS:.o=.d)
endif
# add Makefiles themselves to prerequisites here (with a changed Makefile,
# the only safe thing is to rebuild all):
%.o: %.c Makefile
$(CC) -c $(CFLAGS) -o$@ $<
# remove dependency files on clean
clean:
rm -f *.o *.d
.PHONY: all clean
这只是一个例子,如何使用这些功能有很多可能性。