我无法理解make中的内容。我有一个mainMakefile调用子目录中的另一个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)

当我运行mainMakefile时,这是输出:
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
谢谢你的帮助!

最佳答案

我认为,如果为调用$(NAME)libaf/libaf.a(在顶级makefile中)添加规则,那么让get-libaf依赖于实际的文件而不是虚假的目标(libaf/libaf.a)是可行的。
(问题是没有带make比较时间戳的make -C libaf文件,因此必须假设每次运行后结果都是“修改的”。)

10-07 15:35