这是我的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
答案 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