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

时间:2013-11-30 20:57:18

标签: c makefile

我无法理解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一次。

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

如果您为$(NAME)添加规则,我认为让libaf/libaf.a取决于实际文件get-libaf而不是虚假目标(libaf/libaf.a)会很有效调用make -C libaf的顶级makefile。

(问题是没有get-libaf文件带有要比较的make的时间戳,所以它必须假设每次运行后结果都被“修改”。)