Makefile编译对象并移动它们时出现问题

时间:2017-11-22 01:54:50

标签: c gcc makefile

这是我的Makefile:

.PHONY : clean fclean re $(LIB_PATH) 

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 func1.c

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

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

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

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

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

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

fclean : clean
    -rm $(NAME)
    $(MAKE) -C $(LIB_DIR) fclean --no-print-directory

re: fclean
    make

当我做的时候,我希望规则$(OBJ_DIR)%.o : %.c编译两个对象(func1.c main.c)并将它们移动到对象目录。但规则只发生在用SRC

编写的第一个源文件中

2 个答案:

答案 0 :(得分:0)

  

编译两个对象(reader.c main.c)

您的意思是toml而不是func1.c吗?

如果是这种情况,请检查reader.c文件是否与func1.c在同一目录中。如果它不在同一目录中,则您必须编写另一个模式规则。像这样:

main.c

答案 1 :(得分:0)

$(NAME): $(OBJ_DIR)$(OBJ)不会将$(OBJDIR)应用于每个项目$(OBJ)。 它实际上只是将$(OBJDIR)连接到列表中。这就是为什么只有一个模式规则实例触发(只有一个.o具有模式试图匹配的路径前缀)。

相反,请使用:

OBJ_WITH_PATH := $(foreach obj,$(OBJ),$(OBJ_DIR)$(obj))

然后将您对NAME规则的依赖关系更新为

$(NAME): $(OBJ_WITH_PATH) $(LIB_PATH)

顺便说一句,我发现添加像

这样的规则有时会很有帮助
.PHONY: DEBUG
DEBUG:
    @echo MAKING SURE THIS WORKS: $(OBJ_DIR)$(OBJ)
    @echo ALTERNATE: $(OBJ_WITH_PATH)

然后你可以运行你的DEBUG目标:

$ make DEBUG
MAKING SURE THIS WORKS temp/a.o b.o
ALT temp/a.o temp/b.o