为何我的Makefile持续出现警告?构建目标报错求助
问题原因与修正方案
核心问题拆解
OBJS变量路径重复处理
你连续两次对OBJS进行路径处理:OBJS := $(SRCS:%.c=$(DIR)%.o) OBJS := $(addprefix $(DIR), $(OBJS))第一次替换后,
./Srcs/xsh.c会变成.build./Srcs/xsh.o(.build直接拼接原路径的./),第二次再加.build前缀,最终OBJS变成.build.build./Srcs/xsh.o,完全偏离预期的路径结构。规则冲突与匹配失败
错误的OBJS路径让Make无法匹配$(DIR)/%.o : %.c的模式规则,反而误将.build当成需要依赖%.c的目标,和你后面定义的.build:目录生成规则冲突,因此出现命令覆盖警告;同时因为%.c是通配符而非实际文件,直接触发"无法找到目标"的报错。
修正后的Makefile
只需修正OBJS的路径转换逻辑,去掉重复的前缀添加操作:
CC := cc NAME := minishell SRCS = ./Srcs/xsh.c DIR = .build # 正确转换:将所有.c文件映射到.build目录下对应的.o文件 OBJS := $(patsubst %.c,$(DIR)/%.o,$(SRCS)) # 模式规则:匹配任意.c文件,生成对应路径的.o文件 $(DIR)/%.o : %.c $(CC) -c -o $@ $< $(NAME) : $(OBJS) | $(DIR) $(CC) -o $@ $^ # 创建.build目录 $(DIR): mkdir -p $@ all : $(NAME)
如果需要在.build内保留原Srcs子目录结构,可将OBJS转换逻辑改为:
OBJS := $(patsubst ./Srcs/%.c,$(DIR)/Srcs/%.o,$(SRCS))
同时要确保子目录存在,可在编译规则中添加目录创建:
$(DIR)/%.o : %.c mkdir -p $(dir $@) $(CC) -c -o $@ $<
说明
修正OBJS路径后,Make能正确匹配模式规则,.build的目录生成规则也不会再和其他规则冲突,警告与报错都会消失。
内容的提问来源于stack exchange,提问作者nebilx
相关产品推荐
相关产品推荐

