初学者指南:深入解析makefile格式与用法
"这篇文档是关于makefile的格式解析,主要面向初学者,旨在帮助理解并掌握makefile的编写规则。文档中通过实例展示了如何编译链接目标文件,以及使用makefile进行自动化构建过程。" 在编程领域,makefile是一个非常重要的工具,它用于自动化编译、链接和清理等构建过程。对于初学者来说,理解makefile的基本格式和规则是十分必要的。本文档将详细解析makefile的结构和语法,以帮助初学者快速上手。 1. makefile中的目标与依赖关系: 在示例中,`led.bin` 是最终的目标文件,它依赖于 `led.o`。这种目标与依赖的关系通过冒号(`:`)分隔,例如:`led.bin: led.o`。当 `led.o` 改变时,`led.bin` 将被重新构建。`%.o:%.S` 和 `%.o:%.c` 是模式规则,表示所有 `.o` 文件分别对应于相应的 `.S` 或 `.c` 源文件。 2. 编译和链接指令: - `arm-linux-ld -Ttext0x0 -o led.elf $^`:这行命令用于链接 `.o` 文件到 `.elf` 文件,其中 `-Ttext0x0` 指定了程序加载地址为 0x0,`-o` 后的 `led.elf` 是输出文件,`$^` 表示所有依赖项(这里即 `led.o`)。 - `arm-linux-objcopy -Obinary led.elf led.bin`:此命令将 `.elf` 文件转换为二进制 `.bin` 文件,适用于嵌入式系统。 - `arm-linux-objdump -D led.elf > led_elf.dis`:使用 `objdump` 工具将 `.elf` 文件反汇编到文本文件 `led_elf.dis`,方便查看和调试。 3. 清理规则: `clean:` 后的命令 `rm *.o *.elf *.bin *.dis mkx210` 用于删除生成的中间文件,保持工作目录整洁。 4. 模式规则和变量: - `%` 符号在规则中代表匹配任何字符的模式,例如 `%.o:%.S` 表示将所有 `.S` 文件编译成相应的 `.o` 文件。 - `$@` 表示目标文件,`$<` 表示第一个依赖项。在 `arm-linux-gcc -o $@ $< -c` 这样的命令中,`$@` 替换为目标文件,`$<` 替换为源文件。 - 变量赋值:`=`, `:=` 和 `?=` 分别代表不同的赋值方式,`=` 是延迟赋值,`:=` 是立即赋值,`?=` 是如果变量未定义才赋值。 5. 使用mkv210_image.c创建固件: `gcc mkv210_image.c -o mkx210` 编译 `mkv210_image.c` 生成可执行文件 `mkx210`,然后通过 `./mkx210 led.bin 210.bin` 创建特定平台(如MK210)的固件文件。 这个文档通过具体的示例详细解释了makefile中的基本元素,包括目标、依赖、编译指令、清理规则以及变量的使用,这对于初学者学习和编写自己的makefile非常有帮助。通过理解这些内容,可以更高效地管理项目构建过程,提高开发效率。
Makefile示例如下:
led.bin: led.o
arm-linux-ld -Ttext 0x0 -o led.elf $^
arm-linux-objcopy -O binary led.elf led.bin
arm-linux-objdump -D led.elf > led_elf.dis
gcc mkv210_image.c -o mkx210
./mkx210 led.bin 210.bin
%.o : %.S
arm-linux-gcc -o $@ $< -c
%.o : %.c
arm-linux-gcc -o $@ $< -c
clean:
rm *.o *.elf *.bin *.dis mkx210 -f
Makefile格式分析如下:
Makefile三大组成:目标、依赖、命令
(目标文件的生成依赖于命令行对依赖文件的处理。要将所有能生成的.0文件都写到依赖里面。)
后缀说明:.bin为目标文件(启动文件),可直接烧录到芯片中运行。
.o为依赖文件,其生成源于.s(汇编文件)或.c(C文件),%表示名字,编译时名字要一致。
.elf文件为系统可执行文件格式,相当于WINDOWS里的EXE格式.
.dis文件为反汇编生成文件,全称:disassemble(反汇编)
Makefile命令行分析:
1、命令行:arm-linux-ld -Ttext 0x0 -o led.elf $^
ld 表示连接。-T用于指定链接脚本,本例中0x0为编译时链接地址。
-o 左边为输入,右边为输出。
-c 代表只进行预处理、编译和汇编操作,不进行链接。
链接是在最后一步进行的,在生成.o文件的过程中一定要加-C进行说明。
-f 强制执行操作。
理论上这个程序会被下载到0X0这个内存地址来运行。
但实际上我们用DNW下载工具下载程序时是下载到0XD0020010,这是地址映射的原理。实际地址是一样的。在有的makefile中写作―Tlink.lds其中link.lds为一个链接脚本,脚本里写了链接地址,和上面效果一样。
2、命令行:arm-linux-objcopy -O binary led.elf led.bin
objcopy用于从一个文件拷贝二进制目标代码到另一个文件,并在这一过程中执行各种转换。binary:二进制的
3、命令行:arm-linux-objdump -D led.elf > led_elf.dis
objdump表示反汇编,'>' 表示将这个程序的反汇编程序写入到 .dis文件中,在终端中不显示出来.
4、命令行:gcc mkv210_image.c -o mkx210 ./mkx210 led.bin 210.bin
mkv210_image.c的主要作用是通过编译此文件,使得由usb启动时使用的led.bin制作得到由sd卡启动的镜像210.bin gcc(gnu collect compiler)是一组编译工具的总称。 它主要完成的工作任务是“预处理”和“编译”。
5、命令行:arm-linux-gcc -o $@ $< -c
Makefile有三个非常有用的变量。分别是$@,$^,$<代表的意义分别是:
$@--目标文件,$^--所有的依赖文件,$<--第一个依赖文件。
6、= 是最基本的赋值,变量值是最终覆盖后的值 += 是添加等号后面的值
:= 是覆盖之前的值,变量值取决于所在位置 ?= 是如果没有被赋值过就赋予等号后面的值
例如:x = foo y = $(x) bar x = xyz 则 y = xyz bar $(变量名)表示调用变量
x := foo y := $(x) bar x := xyz 则 y = foo bar
makefile更深入一步的分析:
1、有的makefile中在开始加入如下代码:
#将指令用较简单字母代替,方便操作。
CC = arm-linux-gcc
LD = arm-linux-ld
OBJCOPY = arm-linux-objcopy
OBJDUMP = arm-linux-objdump
AR = arm-linux-ar
剩余5页未读,继续阅读
- 粉丝: 21
- 资源: 10
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 李兴华Java基础教程:从入门到精通
- U盘与硬盘启动安装教程:从菜鸟到专家
- C++面试宝典:动态内存管理与继承解析
- C++ STL源码深度解析:专家级剖析与关键技术
- C/C++调用DOS命令实战指南
- 神经网络补偿的多传感器航迹融合技术
- GIS中的大地坐标系与椭球体解析
- 海思Hi3515 H.264编解码处理器用户手册
- Oracle基础练习题与解答
- 谷歌地球3D建筑筛选新流程详解
- CFO与CIO携手:数据管理与企业增值的战略
- Eclipse IDE基础教程:从入门到精通
- Shell脚本专家宝典:全面学习与资源指南
- Tomcat安装指南:附带JDK配置步骤
- NA3003A电子水准仪数据格式解析与转换研究
- 自动化专业英语词汇精华:必备术语集锦