gpt4 book ai didi

c - 为什么当我在子目录中调用 make 时 Make 会重新链接?

转载 作者:太空宇宙 更新时间:2023-11-04 04:46:32 25 4
gpt4 key购买 nike

我无法理解 make 中的内容。我有一个主 Makefile 调用子目录中的另一个 Makefile。我希望 make没有任何变化 时不要重新链接。但似乎子目录 make,无论是否完成某事,都会触发一个新的链接。

这是主要的Makefile

NAME = app

CC = gcc

SRC = app.c

OBJ = $(SRC:.c=.o)

all: $(NAME)

$(NAME): get-libaf $(OBJ) app.h
$(CC) -L./libaf/ -laf -o $@ $(OBJ)

%.o: %.c
$(CC) -c $< -o $@

get-libaf:
$(MAKE) -C ./libaf/

这是我在子目录 ./libaf/Makefile

中的库
NAME = libaf.a

CC = gcc

SRC = af_app_helper.c af_app_argv_parser.c af_app_memory.c

OBJ = $(SRC:.c=.o)

all: $(NAME)

$(NAME): libaf.h
$(CC) -c $(SRC)
ar rc $(NAME) $(OBJ)
ranlib $(NAME)

当我运行主要的 Makefile 时,这是输出:

user@machine $ make
make -C ./libaf/
make[1]: Nothing to be done for `all'.
gcc -L./libaf/ -laf -o app app.o
user@machine $ make
make -C ./libaf/
make[1]: Nothing to be done for `all'.
gcc -L./libaf/ -laf -o app app.o

但是当我删除 libaf 依赖项 (get-libaf) 时,它只会显示:

user@machine $ make
make: Nothing to be done for `all'.

...当我在 make 命令之间没有改变任何东西时,这就是我想要的。我什至检查了所有文件的时间戳,没有一个被修改/编辑/触及。与图书馆相同。

我知道当源文件或依赖项发生变化时,make 会重新链接。在这里,我不明白“子制作”为什么要这样做。

有人可以解释为什么 make 重新链接以及如何避免这种情况。不过,我想保留 get-libaf 依赖项,因此我可以更新它并为整个项目只运行一次 make

感谢您的帮助!

最佳答案

我认为让 $(NAME) 依赖于实际文件 libaf/libaf.a 而不是虚假目标(get-libaf ) 如果您为调用 make -C libaflibaf/libaf.a 添加规则(在顶级 makefile 中)。

(问题在于没有带有时间戳的 get-libaf 文件供 make 进行比较,因此它必须假设结果在每次运行后都被“修改”。)

关于c - 为什么当我在子目录中调用 make 时 Make 会重新链接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20305545/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com