Makefile报错:混合隐式与普通规则(废弃语法)求助
解决Makefile中的"mixed implicit and normal rules"错误
你踩了Makefile新手常犯的一个典型小错误——目标文件后缀写错了,咱们一步步拆解问题:
错误根源分析
你定义的_OBJS变量里放的是.c源文件:
_OBJS = errorhandling.c calculator.c helpmenu.c
但你的编译规则是用来生成.o目标文件的:
$(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS)
当Make处理OBJS = $(patsubst %,$(OBJ_DIR)/%,$(_OBJS))时,得到的是home/errorhandling.c这类路径。它会试图为这些.c文件寻找构建规则,但你的规则是针对.o文件的,这就导致Make混淆了隐式规则(默认处理.c文件的规则)和你写的普通规则,触发了"mixed implicit and normal rules"的废弃语法报错,同时找不到正确的目标文件构建规则,出现"No rule to make target '/%.c'"的错误。
修复步骤
只需要把_OBJS里的文件后缀改成.o,让它和你的编译规则匹配:
修改后的完整Makefile
CC=gcc CFLAGS= -g -Wall LIBS= TARGET= test SRC_DIR = sourceFiles OBJ_DIR = home INC_DIR = headerFiles _DEPS = flags.h errorhandling.h helpmenu.h # 这里把.c后缀改成.o _OBJS = errorhandling.o calculator.o helpmenu.o DEPS = $(patsubst %,$(INC_DIR)/%,$(_DEPS)) OBJS = $(patsubst %,$(OBJ_DIR)/%,$(_OBJS)) $(OBJ_DIR)/%.o: $(SRC_DIR)/%.c $(DEPS) $(CC) -c -o $@ $< $(CFLAGS) $(TARGET): $(OBJS) $(CC) -o $@ $(OBJS) $(LIBS) .PHONY: clean clean: $(RM) $(OBJS) $(TARGET)
验证方法
- 确保目录结构正确:
sourceFiles/下存放errorhandling.c、calculator.c、helpmenu.cheaderFiles/下存放flags.h、errorhandling.h、helpmenu.h
- 运行
make命令,应该能正常编译生成test可执行文件 - 运行
make clean可以清理生成的目标文件和可执行文件
内容的提问来源于stack exchange,提问作者Kus
相关产品推荐
相关产品推荐

