我无法理解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)
当我运行main
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
。谢谢你的帮助!
最佳答案
我认为,如果为调用$(NAME)
的libaf/libaf.a
(在顶级makefile中)添加规则,那么让get-libaf
依赖于实际的文件而不是虚假的目标(libaf/libaf.a
)是可行的。
(问题是没有带make比较时间戳的make -C libaf
文件,因此必须假设每次运行后结果都是“修改的”。)