如何将src/和inc/生成的.o目标文件重定向到obj/目录?
解决方案
修改后的Makefile如下:
NAME = push_swap # 收集src和inc目录下的所有.c文件 SRC = $(wildcard ./src/*.c) INC = $(wildcard ./inc/*.c) # 将所有.c文件映射为obj目录下的.o文件 OBJ = $(addprefix obj/,$(notdir $(SRC:.c=.o)) $(notdir $(INC:.c=.o))) CC = gcc # 添加头文件搜索路径,确保编译时能找到对应目录的头文件 CFLAGS = -Wall -Werror -Wextra -Isrc -Iinc $(NAME): $(OBJ) $(CC) $(CFLAGS) $^ -o $@ # 规则:从src目录的.c文件生成obj目录的.o文件 obj/%.o: src/%.c @mkdir -p obj # 确保obj目录存在,避免编译报错 $(CC) $(CFLAGS) -c $< -o $@ # 规则:从inc目录的.c文件生成obj目录的.o文件 obj/%.o: inc/%.c @mkdir -p obj $(CC) $(CFLAGS) -c $< -o $@ all: $(NAME) clean: rm -rf obj/*.o fclean: clean rm -f $(NAME) re: fclean all
关键修改说明
- 统一目标文件路径:通过
$(notdir)提取源文件的文件名,再用$(addprefix)将前缀obj/添加到所有.o文件名前,确保所有目标文件都生成在obj/目录下 - 自定义编译规则:新增两个模式规则,明确告诉make如何从src/或inc/目录的.c文件编译生成obj/目录的.o文件;
@mkdir -p obj会自动创建obj目录(如果不存在),避免因目录缺失导致编译失败 - 头文件路径配置:在
CFLAGS中添加-Isrc和-Iinc,确保编译时编译器能正确找到这两个目录下的头文件(如果你的代码中引用了对应目录的头文件,这一步是必须的) - 修正clean规则:改为删除obj/目录下的.o文件,避免误删其他目录的文件
内容的提问来源于stack exchange,提问作者Tde-melo
相关产品推荐
相关产品推荐

