好,废话不多说,进入正题,来看我们今天的要讲的Makefile:

lcd.bin: start.o main.o led.o clock.o uart.o lib.o lcd.oarm-linux-ld -Ttext 0x20000000 -o lcd.elf $^arm-linux-objcopy -O binary lcd.elf $@  arm-linux-objdump -D lcd.elf > lcd.disgcc -o mktools mktools.c./mktools $@ new_lcd.bin
%.o : %.S   arm-linux-gcc -o $@ $< -c
%.o : %.c   arm-linux-gcc -o $@ $< -c   clean:  rm *.o *.elf *.bin *.dis mktoolsload:dd iflag=dsync oflag=dsync if=new_lcd.bin of=/dev/sdb seek=1

1. Makefile的基本规则:

 target... : prerequisites ...

          command

target  :目标文件,可以是obj文件,也可以是执行文件或标签

prerequisites: 要生成那个target所需要的文件或是目标。

command:make需要执行的命令,就是一些shell命令

注意: command前面是一个Tab,不是空格

2.第一行表示要编译出lcd.bin需要依赖后面的.o文件,接下来的四行就是command,通过它们来编译出lcd.bin。

3.arm-linux-ld是命令,交叉编译工具中的命令,-Ttext :指定代码段的起始地址  , -o :表示输出的文件。

4. $^ : 这是一个自动变量,它表示所有依赖目标的集合,即:start.o main.o led.o clock.o uart.o lib.o lcd.o  。

5.arm-linux-objcopy被用来复制一个目标文件的内容到另一个文件中,-O:输出的格式,在拷贝的过程中会进行格式转换。

6.$@ :这又是一个自动变量,它表示规则中的目标文件集,即lcd.bin

7. arm-linux-objcopy -O binary lcd.elf $@ : 这行是将.elf文件(lcd.elf)转换成二进制的.bin文件(lcd.bin)

8.arm-linux-objdump用来查看反汇编代码  , -D:表示反汇编所有的段。

9. 接着gcc编译mktools.c ,然后用编译出来的mktoos将lcd.bin转成new_lcd.bin

10.目标中的"%"定义表示对文件名的匹配,"%"表示长度任意的非空字符串, 如果要生成的start.o, 那么"%.s"表示start.s

11. $< : 依赖目标中的第一个目标名字。如果依赖目标是以模式(即"%")定义的,那么"$<"将是符合模式的一系列的文件集。注意,其是一个一个取出来的。

12.arm-linux-gcc -o $@ $< -c  : 依次编译对应的目标, -c参数将对源程序进行预处理、编译、汇编操作。

13. load是一个label, 它下面的语句是执行dd命令,该命令的使用可以自行百度。

14.make执行流程: makefile一般是从上往下执行, 当执行第一行时,发现没有依赖对象,所以会先向下找,然后就找到有两个目标会编译出所需要的.o文件,所以依次执行arm-linux-gcc命令。编译出.o文件后就去第一行下面依次执行命令来编译出new_lcd.bin文件。

总结:该份Makefile比较复杂的就是那些自动变量和一些交叉编译命令,交叉编译命令比较少用,需要用的时候再查或直接拷贝过去用

每天一篇Makefile(二)相关推荐

  1. 每天一篇Makefile(一)

    前言 网络上有很多讲解Makefile的文章和博文,看完之后感觉挺简单的,但是真正让我们自己写一份Makefile,又感觉很困难,没办法完成这项"简单"的任务.O(∩_∩)O哈哈~ ...

  2. ARM裸机篇(二)——i.MX6ULL启动过程

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  3. linux系统移植篇(二)—— Uboot使用介绍

    linux系列目录: linux基础篇(一)--GCC和Makefile编译过程 linux基础篇(二)--静态和动态链接 ARM裸机篇(一)--i.MX6ULL介绍 ARM裸机篇(二)--i.MX6 ...

  4. C# 温故而知新:Stream篇(二)

    C# 温故而知新:Stream篇(二) TextReader 和StreamReader 目录: 为什么要介绍 TextReader? TextReader的常用属性和方法 TextReader 示例 ...

  5. 可视化篇(二)———使用matplotlib绘制常用3D图形及案例

    可视化篇(二)---使用matplotlib绘制常用3D图形及案例 摘要 (一)添加matplotlib 3D模块 (二)3d图中绘制曲线 (三)3d图中绘制散点图 (四)3d图中绘制线框图 (五)3 ...

  6. 基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二)

    基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(二) 转载于:https://github.com/Meowv/Blog 上篇文章完成了两个接口:文章列表页.文章详 ...

  7. uvm 形式验证_验证平台自动化篇之二:UVM Framework

    原标题:验证平台自动化篇之二:UVM Framework 一个UVM使用者,从新手到精通大致会经历三年的时间,而在经过这三年之后,verifier会有倦怠期.除了不可避免地在80%以上工作处于重复性劳 ...

  8. ie9无法获取未定义或 null 引用的属性“indexof”_前端JS基础篇(二)JS基本数据类型和引用数据类型及检测数据类型方法...

    JS中的数据类型 (一).基本数据类型(值类型) 1.number:数字 -12.12.5.-12.5 0这些数字都是number: js中增加了一个number类型的数据:'NaN' typeof ...

  9. CCNP-第十篇-BGP(二)

    CCNP-第十篇-BGP(二) 首先 BGP都基本上部署在PE,CE设备 PE:Provider edge =运营商边界 CE:Customer edge =用户边界 建立BGP 1.一般呢,是会使用 ...

最新文章

  1. Linux安装FTP服务-----vsftpd
  2. spyder matlab,将pycharm配置为matlab或者spyder的用法说明
  3. 运行npm update等命令出错后如何分析问题根源
  4. 用相对路径从一个项目跳转到另一个项目_如何用2天时间,从0到N的完成一个学习项目设计?...
  5. 服务发现与健康监测框架Consul-DNS转发的应用
  6. Java-消息框显示两整数加减乘除
  7. C#写爬虫,版本V2.1
  8. web前端网站推荐(后续继续补充)
  9. WIN7安装MTK驱动(系统找不到指定文件!解决方案)
  10. 反射之动态拼接sql字符串
  11. java obj_java中的 compareTo(Object obj)的obj怎么理解
  12. 教你用GoldWave剪裁音频作短视频BGM
  13. 寻中华文化之根 承抗战先烈之志
  14. C语言蜗牛爬墙(个人练习)
  15. Adobe Acrobat 无法打开文件附件,因为您的PDF文件附件设置不允许打开本类型的文件
  16. python画图双纵轴多张图折线柱状图
  17. 密码学之对称加密体系(2):AES、SM4的 S 盒具体算法的实现
  18. 写一个Singleton模式的例子
  19. 【智能制造】全球人工智能与制造业融合的现状及思考
  20. 在VMware上安装kali(7z格式)并配置中文环境

热门文章

  1. Ubuntu13.04 安装flash 播放器
  2. 显控触摸屏做主站,显控PLC做从站 Modbus RTU通讯
  3. C# wpf 使用ListBox实现尺子控件
  4. 《惢客创业日记》2020.12.29-30(周二)我们都是商人
  5. 2021 年 10 月 TIOBE 指数榜:Python 超越 C 语言成 20 多年来的新霸主
  6. 2009年“中国安防10大品牌”榜
  7. T440S黑苹果完美升级mac10.14.3,更换内置无线网卡dw1820A(BCM94350ZAE)驱动完美上图求点赞!
  8. 密林深处里藏着一个古国
  9. 用Java分割和合并PDF文件
  10. 【GitHub】在Github主页显示你的个人简历