makefile不仅仅是一个命令的集合体,其中有一些规则是需要理解掌握的。

首先,了解makefile的规则:

//-----------格式----------

目标 : 依赖1,依赖2

(TAP键)命令

//-------------------------

1、目标,就是我们想生成的文件。

2、依赖往往是我们已经有的文件,是生成目标的必要条件。

3、命令就是利用依赖来产生目标。

命令不是任何情况都可以执行的,它是有条件的:

1、目标不存在 or  2、依赖已更新(首先依赖是存在的)。

牛刀小试:

1、编译和链接放一块了:

hello: hello.c  a.c

gcc -o hello  hello.c  a.c

hello是目标,命令执行后会被生成。hello可通过“.\hello”执行。

gcc 可以理解为是linux中的一个软件,而 -o 就是软件中的一个按键(选项),hello.c  a.c就是已经添加的模块文件。

这就是命令,就像是你在windows里打开一个软件,添加文件,然后按下编译按钮。命令就是这么一回事。

2、编译和链接分开:

过程分析:首先目标hello 依赖于 hello.o 和 a.o

结果这两个依赖不存在,那么向下找目标。

发现目标hello.o,依赖于hello.c(这个是存在的)。满足目标不存在

那么执行命令 gcc -o hello -c hello.c//表示编译hello.c输出hello.o但不链接。

下边的同理。。。。。。。

现在两个.o文件都有了,那么这条命令可以执行了:

gcc -o hello  hello.o a.o//链接这两个文件,输出hello可执行文件。

这样的好处是:

利用规则:1、目标不存在。or 2、依赖已更新(首先依赖是存在的)。

可以不编译,没有修改的文件,从而节省编译时间。

最后,还可以简写:

分析下:

$@ 表示的是目标(的集合);

$^ 表示的是依赖(的集合);

%.o 表示所有的.o文件

%.c 表示所有的.c文件

$<  表示(目标:后面列表里)第一个依赖!

这里提一点:

1、当我们执行make的时候,我们的目的是,参数该文件的第一个目标,就是hello。所以clean 下的命令并不会执行。

2、clean是一个虚拟的目标,并没有依赖项。我们可以通过 make clean 这个命令去执行它下边这个命令(清楚掉所有的.o文件)

再来看一个复杂一点的:

第一行是什么,意思目前我也不知道,可以把它看成是一个函数,makefile中调用函数的方式就是”$( ) ”

arm-linux-gcc 就是linux的中的另一个软件了——交叉编译器。

何为,交叉编译?就是在一个平台编译,生成一个可以在另一个平台运行的文件。

具体看看这句:

arm-linux-gcc  $(CFLAGS)  -c  -o  crt0.o  crt0.S

看着“-c  -o  crt0.o  crt0.S”这条命令的顺序,你是否感觉奇怪?

如果,你把-c  -o 理解成两个按键,感觉可能好很多。

之所以这么随意的顺序,去写,是因为这些选项往往有一个特性,就是忽略掉后面自己不需要的文件。

这段makefile以后还会具体分析,今天就到这里~~

2014-11-25

宋桓公

最新文章

  1. 假装这些是MyEclipse的快捷键(1)
  2. python判断文件和目录是否存在
  3. android Java BASE64编码和解码二:图片的编码和解码
  4. 三层架构中bll层把datatable转换为实体model的理解
  5. docker-gerrit
  6. JavaWeb学习总结(六)—HttpServletResponse
  7. SysTick 定时器的使用
  8. 【转】Ext.ajax.request 中的success和failure
  9. Oracle11g R2学习系列 之七安全性
  10. javascript基础(六)对象
  11. 遇到local variable &#39;e&#39; referenced before assignment这样的问题应该如何解决
  12. SSH防暴力破解脚本
  13. $Django content_type组件 缓存组件
  14. Codeforces 767E Change-free
  15. 第三章&#160;列表(d)选择排序
  16. 解决C#项目出现“此项目引用这台计算机上缺少的 NuGet 程序包。使用 NuGet 程序包还原可下载这些程序包。有关详细信息,请参阅 http://go.microsoft.com/fwlink/?LinkID=322105。缺少的文件是 ..\packages\Microsoft.Net.Compilers.1.0.0\build\Microsoft.Net.Compilers.props”
  17. 简单实现网页另存为word或者excel
  18. android中使用spinner组件
  19. Oracle 账户锁定问题解决办法
  20. pagination分页(支持首页,末页,跳转)

热门文章

  1. show命令
  2. go语言浮点数
  3. Git创建本地仓库并推送至远程仓库
  4. selenium 校验文件下载成功
  5. 从专用磁盘创建 Windows VM
  6. ndk的注意事项
  7. python基础之os.system函数
  8. python-异常处理try_except
  9. Android之间传递数据包
  10. 【转】Mybatis学习---MyBatis知识、原始Dao开发和mapper代理开发