首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Makefile:需要运行两次`make`来重新链接对象文件

Makefile:需要运行两次`make`来重新链接对象文件
EN

Stack Overflow用户
提问于 2021-09-25 17:13:22
回答 1查看 80关注 0票数 0

这是我的Makefile的相关部分。

代码语言:javascript
复制
...
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看起来像这样。

代码语言:javascript
复制
...
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源代码中的某些文件,它也不会重新编译。

EN

回答 1

Stack Overflow用户

发布于 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

代码语言:javascript
复制
libft/libft.a: FORCE
        $(MAKE) -C libft

libgc/libgc.a: FORCE
        $(MAKE) -C libgc

FORCE:;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69328385

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档