【问题标题】:How to know if a library exists or is up to date with makefile如何知道库是否存在或是否使用 makefile 是最新的
【发布时间】:2017-11-21 06:17:10
【问题描述】:

这是我的 Makefile:

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 检查我的 lib 是否已更新或存在,如果不是,请编译它(如对象和源),但当我这样做时,它只会争论循环规则和无论如何编译我的库。

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

【问题讨论】:

  • 你不应该有类似mylib.a: $(OBJECTS)的东西吗? (或指定mylib的绝对路径)

标签: c makefile static-libraries


【解决方案1】:

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

试试:

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

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

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

【讨论】:

  • 我一直在尝试你的解决方案,但我无法让它发挥作用,我一直在说循环规则。
  • 确保您没有上面的$(LIB_PATH) : $(LIBPATH) 规则。我的本意是要替换它。
猜你喜欢
  • 2016-04-26
  • 2011-02-03
  • 2020-06-30
  • 2018-01-06
  • 2020-09-12
  • 1970-01-01
  • 2011-03-20
  • 2019-09-06
  • 1970-01-01
相关资源
最近更新 更多