gpt4 book ai didi

c - 如何知道库是否存在或是否与 makefile 保持同步

转载 作者:太空宇宙 更新时间:2023-11-04 04:20:33 24 4
gpt4 key购买 nike

这是我的生成文件:

NAME = fillit

FLAGS = -Wall -Wextra -Werror

LIB_NAME = libft.a

LIB_DIR = ../libft/

LIB_PATH = $(LIB_DIR)$(LIB_NAME)

OBJ_DIR_NAME = objects

OBJ_DIR = $(OBJ_DIR_NAME)/

HEADER_DIR = ../libft

SRC = main.c

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

all :
mkdir -p $(OBJ_DIR_NAME)
$(MAKE) $(NAME)

$(NAME) : $(OBJ) $(LIB_PATH)
gcc -o $(NAME) $(addprefix $(OBJ_DIR), $(OBJ)) -L$(LIB_DIR) -lft

$(LIB_PATH) : $(LIB_PATH)
$(MAKE) -C $(LIB_DIR) --no-print-directory

%.o : %.c
gcc $(FLAGS) -I$(HEADER_DIR) -c $<
mv $@ $(OBJ_DIR)

clean :
rm -f $(addprefix $(OBJ_DIR), $(OBJ))
rm -rvf $(OBJ_DIR_NAME)

fclean : clean
rm -f $(NAME)
rm -f $(addprefix $(LIB_DIR), $(LIB_NAME))

re: fclean
make

当我编写 $(LIB_PATH) : $(LIB_PATH) 时,我希望我的 Makefile 检查我的库是否已更新或存在,如果不是,则编译它(如对象和源代码) ) 但当我这样做时,它只会争论循环规则并编译我的库。

那我make的时候应该写什么,只有在我的库还没有编译的时候才会进入$(LIB_PATH):

最佳答案

这是分层 Makefile 的常见问题。您不希望必须两次指定库依赖项(即,一次知道何时启动子生成文件,然后在子生成文件中再次实际构建目标)所以您只需调用子生成文件每次让它决定是否需要重建。

尝试:

.PHONY: $(LIB_PATH) 
$(LIB_PATH):
[tab] $(MAKE) -C $(LIB_PATH) --no-print-directory

每次此 makefile 评估依赖于 $(LIB_PATH) 的目标时,这应该会导致 make 在 $(LIB_PATH) 目录中运行。

.PHONY 适用于不真正代表文件的目标,例如 clean。它只是将目标标记为“陈旧”,即使文件恰好存在并具有该名称并且是新鲜的。

关于c - 如何知道库是否存在或是否与 makefile 保持同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47406408/

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