【Makefile】Makefile 编译 Keil 工程(Linux 环境)
# 定义源代码和目标文件路径变量
USER_DIR = PathToKeilUserDir
CMSIS_DIR = $(USER_DIR)/CMSIS
HAL_DIR = $(USER_DIR)/STM32F1xx_HAL_Driver
FWLIB_DIR = $(USER_DIR)/STM32F1xx_FWLib
# 定义目标文件和路径变量
TARGET = main
MCU = STM32F103ZE
# 定义编译器和链接器
CC = arm-none-eabi-gcc
LD = arm-none-eabi-gcc
SIZE = arm-none-eabi-size
# 定义编译和链接选项
CFLAGS = -g -O2 -mlittle-endian -mthumb -mcpu=cortex-m3 -D$(MCU) -DSTM32F10X_MD -DUI_TASK_STACK_SIZE=200 -I$(CMSIS_DIR)/Include -I$(HAL_DIR)/Inc -I$(FWLIB_DIR)/Inc
LDFLAGS = -Tstm32_flash.ld -nostartfiles -specs=nosys.specs -specs=nano.specs -L$(FWLIB_DIR)/Obj -lc -lm -lgcc
# 定义源代码文件
CSRC = $(wildcard *.c)
ASRC = $(wildcard *.s)
# 生成目标文件
COBJ = $(CSRC:.c=.o)
AOBJ = $(ASRC:.s=.o)
# 定义最终生成的可执行文件
BIN_FILE = $(TARGET).bin
HEX_FILE = $(TARGET).hex
all: $(BIN_FILE) $(HEX_FILE)
$(BIN_FILE): $(TARGET).elf
$(OBJCOPY) -O binary $< $@
$(HEX_FILE): $(TARGET).elf
$(OBJCOPY) -O ihex $< $@
$(TARGET).elf: $(COBJ) $(AOBJ)
$(LD) $^ $(LDFLAGS) -o $@
$(SIZE) $@
%.o: %.c
$(CC) -c $(CFLAGS) $< -o $@
%.o: %.s
$(CC) -c $(CFLAGS) $< -o $@
clean:
rm -f $(COBJ) $(AOBJ) $(TARGET).elf $(BIN_FILE) $(HEX_FILE)
这个Makefile示例展示了如何编译一个使用了CMSIS、HAL 库和 FWLib 的Keil工程。它定义了源代码路径变量、目标文件和路径变量、编译器、链接器、编译选项和链接选项。它使用了通配符和模式规则来自动化编译过程,并生成了二进制和十六进制格式的可执行文件。
评论已关闭