我无法理解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
会重新链接。在这里,我不明白为什么“sub-make”正在这样做。
有人可以解释为什么make
重新链接以及如何防止这种情况。我想保留get-libaf
依赖关系,因此我可以更新它并仅为整个项目运行make
一次。
感谢您的帮助!
答案 0 :(得分:0)
如果您为$(NAME)
添加规则,我认为让libaf/libaf.a
取决于实际文件get-libaf
而不是虚假目标(libaf/libaf.a
)会很有效调用make -C libaf
的顶级makefile。
(问题是没有get-libaf
文件带有要比较的make的时间戳,所以它必须假设每次运行后结果都被“修改”。)