这是我的Makefile的相关部分。
...
LIBS = gc ft
vpath %.a $(LIBS:%=lib%)
all:
$(MAKE) $(NAME)
$(NAME): $(LIBS:%=lib%.a) $(OBJS) | libs
$(CC) $(CFLAGS) $(OBJS) -o $(NAME) $(LDFLAGS)
-include $(DEPENDENCIES)
$(OBJS_DIR)/%.o: %.c $(OBJS_DIR)/debug$(DEBUG) | $(OBJS_DIR)
$(CC) $(CFLAGS) $(INCLUDES_DIR:%=-I %) -c $< -o $@
$(OBJS_DIR):
$(MKDIR) $@
libs: $(LIBS:%=lib%.a)
$(foreach LIB, ${LIBS}, ${MAKE} -C lib${LIB} ;)
lib%.a:
$(MAKE) -C $(@:%.a=%)
...我的问题是,每当我访问我的库中的一个文件时,make重新编译那个库,但我必须运行make第二次,让它重新链接目标文件。
我做错了什么?
提前谢谢。
-编辑
所以现在我的Makefile看起来像这样。
...
all: $(NAME)
$(NAME): $(OBJS) libft/libft.a libgc/libgc.a
$(CC) $(CFLAGS) $(OBJS) -o $(NAME) $(LDFLAGS)
-include $(DEPENDENCIES)
$(OBJS_DIR)/%.o: %.c $(OBJS_DIR)/debug$(DEBUG) | $(OBJS_DIR)
$(CC) $(CFLAGS) $(INCLUDES_DIR:%=-I %) -c $< -o $@
$(OBJS_DIR):
$(MKDIR) $@
libft/libft.a:
$(MAKE) -C libft
libgc/libgc.a:
$(MAKE) -C libgc
...它不再重新链接,但如果更改了我的libs源代码中的某些文件,它也不会重新编译。
发布于 2021-09-25 17:40:30
不能使用vpath查找生成的文件。它只能用于定位源文件(始终存在)。详情请参见http://make.mad-scientist.net/papers/how-not-to-use-vpath/。
你需要使用生成的库的真实路径作为先决条件,这样当make检查它们的修改时间时,它就知道它们已经改变了。
ETA
您正在使用递归make模型进行构建。这意味着这个makefile并不知道你的库是否过时:这里你没有列出它们的任何先决条件,所以只要make存在,它们就是最新的。
相反,您将库是否为最新的知识降级到了子目录makefiles中。这意味着,为了知道它们是否是最新的,您必须运行子make,以便它可以检查。这意味着您总是希望运行子make,它只会在库过期时更新库。一种简单的方法是使用a FORCE target
libft/libft.a: FORCE
$(MAKE) -C libft
libgc/libgc.a: FORCE
$(MAKE) -C libgc
FORCE:;https://stackoverflow.com/questions/69328385
复制相似问题