使用-Wall选项通过SDCC编译8051项目时Makefile报错如何解决
问题原因
你的报错是SDCC调用汇编器时参数不符合要求,核心有两个问题:
- 没有指定8051对应的编译目标架构,SDCC默认不会自动识别为8051目标,需要手动加
-mmcs51参数 - 链接规则里的依赖变量用错,
$<仅代表第一个依赖文件,多源文件场景会缺失依赖,应该用$^代表所有依赖文件
修复后完整Makefile
TARGET = test CC = sdcc # 新增-mmcs51指定编译目标为8051架构 CFLAGS = -Wall -I. -mmcs51 RM = rm -rf SRCS = $(wildcard *.c) RELS = $(patsubst %.c,%.rel,$(SRCS)) $(TARGET).bin: $(TARGET).hex objcopy -I ihex -O binary $< $@ $(TARGET).hex: $(TARGET).ihx packihx $< > $@ $(TARGET).ihx: $(RELS) @echo Linking ... # 将$<改为$^,引入所有rel依赖文件 $(CC) $(CFLAGS) $^ -o $@ @echo Build finish! %.rel: %.c @echo Compiling ... $(CC) $(CFLAGS) -c $< -o $@ .PHONY: clean clean: @echo Removing ... $(RM) *.rel *.ihx *.lk *.lst *.map *.mem *.rst *.sym *.asm $(TARGET).hex $(TARGET).bin @echo Removed!
修改点说明
- CFLAGS新增
-mmcs51参数:明确告知SDCC编译目标为MCS51(8051)架构,避免调用汇编器时参数不匹配 - 链接规则的
$<替换为$^:确保所有编译生成的rel文件都参与链接,不会出现多源文件场景下的符号缺失问题 - clean规则新增删除
$(TARGET).hex和$(TARGET).bin:清理过程覆盖所有生成的产物
内容的提问来源于stack exchange,提问作者Văn Minh Lý
相关产品推荐
相关产品推荐

