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

