主Makefile总领全局的就这句——
lcd.bin: $(objs)
要生成lcd.bin,依赖于objs列举的一堆文件:head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a
所以要先找到这些文件,几个.o,还有一个.a
.o目标文件怎么生成?
%.o:%.c和%.o:%.S是生成规则,就是依赖于.c或.S文件,使用交叉编译命令生成。
.a是库文件,到lib子目录里去找,在子目录里用make命令生成
下面逐行解读:
CC = arm-linux-gcc //编译器。定义CC变量,为了简化书写
LD = arm-linux-ld //连接器。定义LD变量,为了简化书写
AR = arm-linux-ar //库管理器。将多个可重定位的目标模块归档为一个函数库文件。这个变量在lib/makefile文件中使用了
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
INCLUDEDIR := $(shell pwd)/include //定义头文件目录变量 $(shell pwd)为获取当前工作路径
CFLAGS := -Wall -O2 //GCC的编译参数 -Wall显示所有编译错误或警告 -O2优化选项,编译时使用2级优化
CPPFLAGS := -nostdinc -I$(INCLUDEDIR) //GCC编译参数 -nostdinc忽略缺省目录 -Idir把dir加到头文件的搜索路径中,而且gcc会在搜索标准头文件之前先搜索dir.
备注:‘=’与‘:=’的区别:
“=”:make会将整个makefile展开后,再决定变量的值。也就是说,变量的值将会是整个makefile中最后被指定的值。看例子:
x = foo
y = $(x) bar
x = xyz
在上例中,y的值将会是 xyz bar ,而不是 foo bar 。
“:=”表示变量的值决定于它在makefile中的位置,而不是整个makefile展开后的最终值。
x := foo
y := $(x) bar
x := xyz
在上例中,y的值将会是 foo bar ,而不是 xyz bar 了。
export CC LD AR OBJCOPY OBJDUMP INCLUDEDIR CFLAGS CPPFLAGS //这些变量将传递到下级Makefile,本文件中指的是生成lib/libc.a库文件时的Makefile
objs := head.o init.o nand.o interrupt.o serial.o lcddrv.o framebuffer.o lcdlib.o main.o lib/libc.a //定义变量objs,包含了生成目标文件所需的文件
lcd.bin: $(objs) //定义生成目标lcd.bin,依赖于objs对象。执行这条命令时,先生成所有依赖文件,然后依次执行下面三条命令
${LD} -Tlcd.lds -o lcd_elf $^ //执行shell命令,LD变量前面定义”LD = arm-linux-ld“,即进行连接,使用lcd.lds为连接脚本,输出目标为lcd_elf,$^表示全部依赖文件
${OBJCOPY} -O binary -S lcd_elf $@ //执行shell命令,将lcd_elf文件转换成二进制文件,-O表示输出格式,-S表示不从源文件中复制重定位信息和符号信息到目标文件中
${OBJDUMP} -D -m arm lcd_elf > lcd.dis //反汇编lcd_elf文件为lcd.dis文件
.PHONY : lib/libc.a //.PHONY表示伪目标,不要管lib/libc.a文件是否存在
lib/libc.a: //当生成依赖文件lib/libc.a文件时,用下面的命令段,即cd lib; make; cd ..
cd lib; make; cd .. //进入lib目录,然后执行make命令,最后返回到当前目录。在lib子目录执行make命令时将使用子目录的Makefile,但于由前面export命令,本文件定义的一些变量将传递过去
%.o:%.c //%通配符。生成xxx.o文件先要找到xxx.c文件
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $< //-c编译不连接。$@表示目标文件 $<表示第一个依赖文件
%.o:%.S
${CC} $(CPPFLAGS) $(CFLAGS) -c -o $@ $<
clean: //这个clean目标没有依赖对象,肯定是生成不了clean文件的,但会执行下面的命令。前面写明.PHONY : clean就更清楚了
make clean -C lib
rm -f lcd.bin lcd_elf lcd.dis *.o
上一篇:LCD实验学习笔记(二):head.S
下一篇:linux 2.6.22.6 移植
推荐阅读最新更新时间:2024-10-30 23:08
设计资源 培训 开发板 精华推荐
- 用于可调电流源的 LT1764EFE-1.8 LDO 稳压器的典型应用
- 使用 Semtech 的 SC112 的参考设计
- LTC3630MPMSE 4.5V 至 65V 输入至 3.3V 输出、1.5A 稳压器的典型应用电路
- STEVAL-MKI177V1,用于标准 DIL24 插座的 LPS35HW 适配器板
- LT1634AIS8-4.096 单节锂离子电池监控电路的典型应用 (IQ = 20uA)
- LT1182CS 浮动 CCFL 的典型应用电路,具有电位器控制灯电流
- LTM8052AIY 5.6A、36Vin 为两个 2.5V 系列超级电容器充电的典型应用
- PX4机器人无人机车辆/飞行管理单元(VMU/FMU) - RDDRONE-FMUK66
- 具有 6V 栅极驱动器的 LTC3892EUH 高效率、双路 3.3V/8.5V 输出同步降压转换器的典型应用电路
- LTC3859IFE 高效宽输入范围双路 5V/8.5V 转换器的典型应用电路
- 创意改装大比拼:给你一个升压板和净化器,你能改装成啥?
- 炎夏来临,足不出户也能尽享2018东芝PCIM在线展会
- 专为高性能存储而优化的FPGA芯片, 英特尔®Agilex™ M 系列火热发布!
- 上演你的“ADI实验室电路”DIY,赢取E金币 !
- TE Connectivity利用传感和连接解决方案,赋能电动汽车发展 参与有好礼!
- ADI有奖下载活动之19:ADI可编程逻辑控制器(PLC)解决方案(更新版)
- 免费下载 | 注册施耐德电气,下载《施耐德电气参考指南》白皮书
- 福禄克明星款热像仪全新来袭,抢先免费体验赢好礼
- 国产FPGA有奖直播:安路全新FPSoC产品SF1系列(FPGA+MCU),Demo板介绍和案例解析