You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

验证方法

  1. 确保目录结构正确:
    • sourceFiles/下存放errorhandling.c、calculator.c、helpmenu.c
    • headerFiles/下存放flags.h、errorhandling.h、helpmenu.h
  2. 运行make命令,应该能正常编译生成test可执行文件
  3. 运行make clean可以清理生成的目标文件和可执行文件

内容的提问来源于stack exchange,提问作者Kus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:02:58