参考学习:https://www.bilibili.com/video/BV1yE411h7uQ?p=20&vd_source=432ba293ecfc949a4174ab91ccc526d6 便于bsp工程管理,将工程进行分类管理,如下图 Makefile编译脚本文件 bsp文件夹存所写的bsp驱动 imx6ul文件夹存放imx6ull官方sdk文件 imx6ul.lds是链接脚本 obj文件夹存在生成的.o文件 project存放main.c和start.S Makefile编写:
CROSS_COMPILE ?= arm-linux-gnueabihf- TARGET ?= bsp CC := $(CROSS_COMPILE)gcc LD := $(CROSS_COMPILE)ld OBJCOPY := $(CROSS_COMPILE)objcopy OBJDUMP := $(CROSS_COMPILE)objdump INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay INCLUDE := $(patsubst %, -I %, $(INCDIRS)) SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)) CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)) SFILENDIR := $(notdir $(SFILES)) CFILENDIR := $(notdir $(CFILES)) SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)) COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)) OBJS := $(SOBJS) $(COBJS) VPATH := $(SRCDIRS) .PHONY: clean $(TARGET).bin : $(OBJS) $(LD) -Timx6ul.lds -o $(TARGET).elf $^ $(OBJCOPY) -O binary -S $(TARGET).elf $@ $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis $(SOBJS) : obj/%.o : %.S $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< $(COBJS) : obj/%.o : %.c $(CC) -Wall -nostdlib -c -O2 $(INCLUDE) -o $@ $< clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS)Makefile逐行分析:
- CROSS_COMPILE ?= arm-linux-gnueabihf-:定义了交叉编译工具链的前缀,默认使用 arm-linux-gnueabihf-。
- TARGET ?= bsp:定义了目标文件名为 bsp。
- CC := $(CROSS_COMPILE)gcc:定义了 C 编译器。
- LD := $(CROSS_COMPILE)ld:定义了链接器。
- OBJCOPY := $(CROSS_COMPILE)objcopy:定义了目标文件复制工具。
- OBJDUMP := $(CROSS_COMPILE)objdump:定义了目标文件反汇编工具。
- INCDIRS := imx6ul \ bsp/clk \ bsp/led \ bsp/delay:定义了头文件目录。
- SRCDIRS := project \ bsp/clk \ bsp/led \ bsp/delay:定义了源文件目录。
- INCLUDE := $(patsubst %, -I %, $(INCDIRS)):将头文件目录转换成 -I 参数形式。
- SFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.S)):查找所有的汇编文件。
- CFILES := $(foreach dir, $(SRCDIRS), $(wildcard $(dir)/*.c)):查找所有的 C 文件。
- SFILENDIR := $(notdir $(SFILES)):获取汇编文件的文件名部分。
- CFILENDIR := $(notdir $(CFILES)):获取 C 文件的文件名部分。
- SOBJS := $(patsubst %, obj/%, $(SFILENDIR:.S=.o)):生成汇编文件对应的目标文件路径。
- COBJS := $(patsubst %, obj/%, $(CFILENDIR:.c=.o)):生成 C 文件对应的目标文件路径。
- OBJS := $(SOBJS) $(COBJS):所有目标文件列表。
- VPATH := $(SRCDIRS):设置源文件搜索路径。
- .PHONY: clean:声明 clean 为一个伪目标。
- $(TARGET).bin : $(OBJS):生成目标文件 $(TARGET).bin 的规则。
- $(LD) -Timx6ul.lds -o $(TARGET).elf $^:链接生成 ELF 可执行文件。
- $(OBJCOPY) -O binary -S $(TARGET).elf $@:将 ELF 文件转换成二进制文件。
- $(OBJDUMP) -D -m arm $(TARGET).elf > $(TARGET).dis:反汇编生成 dis 文件。
- $(SOBJS) : obj/%.o : %.S:汇编文件编译规则。
- $(COBJS) : obj/%.o : %.c:C 文件编译规则。
- clean: rm -rf $(TARGET).elf $(TARGET).dis $(TARGET).bin $(COBJS) $(SOBJS):清理规则,删除生成的文件。