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

编写SDCC C程序Makefile报错:无规则生成out/main.rel目标

解决SDCC Makefile中"No rule to make target 'out/main.rel'"的错误

错误原因

核心问题是构建规则的目标名与依赖链中的路径不匹配:Makefile里OBJ变量包含带out/前缀的文件(如out/main.rel),但对应的构建规则目标却写成了main.rel,make找不到生成out/main.rel的规则,因此报错。

修正后的Makefile

同时修复了链接逻辑混乱、文件路径不一致等其他问题:

# 自动创建out目录,避免文件生成失败
$(shell mkdir -p out)

SRC = src/main.c src/include/vdu.c src/include/func.c
INC = include/common.h include/mos.h src/include/vdu.h src/include/func.h
MOSLIBSRC = lib/mos.s  # 移除重复的crt/crt0.s,它已有单独构建规则

CRT = out/crt0.rel
MOSLIB = out/mos.rel
OBJ = out/main.rel out/vdu.rel out/func.rel

EXEC = miniGraf.bin  # 和最终生成的二进制文件名统一
CC = sdcc
AS = sdasz80
OBJCPY = sdobjcopy

ASFLAGS=-plosgff
CFLAGS=-mez80_z80 -Iinclude/ -Isrc/include/ --reserve-regs-iy --std-c11 --fno-omit-frame-pointer
LDFLAGS=--no-std-crt0 -mez80_z80 --code-loc 100

all : $(EXEC)

# 修正链接流程:用SDCC生成可重定位文件,再转二进制
$(EXEC) : $(OBJ) $(CRT) $(MOSLIB)
	$(CC) $(LDFLAGS) -o out/a.rel $(OBJ) $(CRT) $(MOSLIB)
	$(OBJCPY) -I ihex -O binary out/a.rel $(EXEC)

# 修正目标文件规则路径,和OBJ变量定义一致
out/main.rel : src/main.c $(INC)
	$(CC) $(CFLAGS) -c src/main.c -o $@

out/vdu.rel : src/include/vdu.c $(INC)
	$(CC) $(CFLAGS) -c src/include/vdu.c -o $@

out/func.rel : src/include/func.c $(INC)
	$(CC) $(CFLAGS) -c src/include/func.c -o $@

$(CRT) : crt/crt0.s
	$(AS) $(ASFLAGS) -o $(CRT) crt/crt0.s

$(MOSLIB) : $(MOSLIBSRC)
	$(AS) $(ASFLAGS) -o $(MOSLIB) $(MOSLIBSRC)

clean :
	rm -rf out/* $(EXEC)

关键修改说明

  1. 路径匹配修正:所有.rel文件的构建规则目标改为带out/前缀的路径,和OBJ变量定义完全一致,让make能正确识别依赖关系。
  2. 目录预创建:通过$(shell mkdir -p out)自动生成输出目录,避免因目录缺失导致文件生成失败。
  3. 链接逻辑简化:移除原Makefile中错误的$(LD)和$(CLD)调用,用SDCC直接完成链接生成可重定位文件,再通过sdobjcopy转换为二进制,符合SDCC常规构建流程。
  4. 依赖补充:给每个.rel规则添加$(INC)作为依赖,确保头文件修改时触发重新编译。
  5. 文件名统一:将EXEC变量改为miniGraf.bin,和最终输出文件名保持一致,避免混淆。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 22:59:57