AVR嵌入式C项目Makefile报错修复及分编译链接多目标实现问题
错误原因
- CFLAGS末尾多余的分号会被shell识别为独立命令,触发
-c: not found报错 - CFLAGS中错误加入了
-o tmpfile参数,且缺失编译阶段必需的-c(只编译不链接)参数,导致内置编译规则执行异常 - 目标文件输出路径未配置到
./build目录,不符合需求 - 编译、链接逻辑混写,未实现分步执行的要求
修复后完整Makefile
# 工具链定义 CC := avr-gcc OBJCOPY := avr-objcopy AVRDUDE := avrdude # 硬件参数配置 MCU := atmega328p F_CPU := 16000000UL UPLOAD_BAUD := 115200 UPLOAD_PORT := /dev/ttyACM0 # 目录配置 SRC_DIR := ./src BUILD_DIR := ./build # 文件列表生成 SRCS := $(wildcard $(SRC_DIR)/*.c) OBJS := $(patsubst $(SRC_DIR)/%.c, $(BUILD_DIR)/%.o, $(SRCS)) ELF_TARGET := $(BUILD_DIR)/firmware.elf HEX_TARGET := $(BUILD_DIR)/firmware.hex # 编译参数(仅编译阶段使用,生成.o文件) CFLAGS := -mmcu=$(MCU) -Os -DF_CPU=$(F_CPU) \ -DDEBUG_MODE=0 -DCOUNTDOWN_MODE=1 -DLAPCOUNTER_MODE=1 -DLAPS=3 \ -Wall -c # 链接参数(仅链接阶段使用,生成elf可执行文件) LDFLAGS := -mmcu=$(MCU) # 默认目标:执行全编译流程 all: compile link hex flash # 编译目标:仅生成所有.o目标文件到build目录 compile: $(BUILD_DIR) $(OBJS) # 链接目标:将所有.o文件链接为elf可执行文件 link: $(ELF_TARGET) # hex生成目标:将elf文件转换为ihex烧录格式 hex: $(HEX_TARGET) # 烧录目标:将hex文件烧录到AVR开发板 flash: $(HEX_TARGET) $(AVRDUDE) -c arduino -p $(MCU) -P $(UPLOAD_PORT) -b $(UPLOAD_BAUD) -U flash:w:$(HEX_TARGET):i # 模式规则:将src目录下的.c文件编译为build目录下的.o文件 $(BUILD_DIR)/%.o: $(SRC_DIR)/%.c $(CC) $(CFLAGS) $< -o $@ # 链接规则:生成elf文件 $(ELF_TARGET): $(OBJS) $(CC) $(LDFLAGS) $(OBJS) -o $@ # hex转换规则 $(HEX_TARGET): $(ELF_TARGET) $(OBJCOPY) -O ihex $< $@ # 自动创建build目录 $(BUILD_DIR): mkdir -p $@ # 清理规则:删除build目录下所有生成文件 clean: rm -rf $(BUILD_DIR) # 声明伪目标,避免和同名文件冲突 .PHONY: all compile link hex flash clean
使用说明
- 单独执行编译:执行
make compile,仅生成所有.o目标文件到build目录 - 单独执行链接:执行
make link,依赖已生成的.o文件输出elf可执行文件 - 单独生成hex:执行
make hex,依赖已生成的elf文件输出烧录用hex文件 - 单独执行烧录:执行
make flash,依赖已生成的hex文件直接烧录到开发板 - 执行全流程编译烧录:执行
make或make all - 清理生成文件:执行
make clean
内容的提问来源于stack exchange,提问作者NoCodeNoBlunder
相关产品推荐
相关产品推荐

