您的位置:首页 > 其它

Makefile 理解(1)

2011-09-10 21:23 387 查看
最近因为需要了解bootloader的一些内容所以看顺便看了一下Mafefile的编写规则。当然了解的只是皮毛了,作为一个学习记录与总结 还是写一篇小文章吧。

作为我在正式工作后的第一次的写博客 也把在百度博客上的文章copy过来了, 当然那是在校时写得, 现在看来写的一般了,不过还是有些参考价值吧, 呵呵 写的差大家多多批评,指教。

呵呵 又说废话了。

先介绍一下两篇中文 文章 《跟我一起写Makefile》 《GNU make中文手册

我看的是第一篇文章,第二篇还没有来得及看,看似写的更好!以后有时间再看。

我写的就是一个读后感吧,做一个总结 呵呵。

在Linux下编程,都有看到Makefile吧,一个人能不能看懂Makefile也就说明了是否是合格的linux程序员,当然了能写Makefile怎能展示一个人在linux上完成大型项目的能力。我是没达到了,我现撑死也就是能够看懂Makefile了。

Makefile最重要的功能就是进行自动编译功能,linux内核,包括Android系统都是靠着Makefile来编译。大家知道一个源程序要最后变为可执行的程序要经过编译(compile)生成目标文件、 链接(link)将目标文件合成一个可执行文件。

OK 大家都知道Makefile用三个基本的条件

target ... : prerequisites ...

command (一定是tab来做的空格)

command

.

.

也就是我们说的目标 依赖 命令 却是Makefile就是这些东西了,不过真正用起来还是比较困难的。

最简单的:

main : main.o

gcc -o main main.o

main.o : main.c

gcc -c main.c

clean:

rm -f mian.o

保存为Makefile(也可以保存为其他文件名用-f 来制定)。执行make命令会去找当前目录下得Makefile的第一个目标,根据依赖文件来执行命令,如果依赖文件找不到 则会向下查找看是否在另一个目标中去生成依赖文件,或者根据make命令的隐含规则去生成依赖文件。

当执行make clean 时候会将生成的目标文件 main.o 删除

以上的make 执行后默认执行main边也就是最终的目标,次目标依赖与main.o文件,而main.o在一开始是不存在的,所以去超找有没有以main.o作为目标的段,如果有次目标,就会根据依赖来执行命令,生成main.o,然后在执行main目标的的命令来生成这个目标文件。

其实make命令是很智能的, 他会去检测目标是否已经生成,如果应生成且依赖修改的时间早与目标生成时间就不去执行命令了,当然当依赖也是又目标生成是还会去递归查找直到查找到真正的 C C++ 文件看他们的修改时间来确定时候执行目标的命令。好像写的有点含糊,反正就是make比较智能,只有在修改源程序后在执行make才会有选择的执行一些命令,对于没有修改的源程序就不在重复执行命令。这个先不了解也木有关系。

上边说到了隐含规则 比如C C++源程序在执行make生成一个可以行文件时候会依赖很多目标文件(.o)而我得Makefile中只说了一览这些.o文件但是没有给这些文件一个生成的命令。make会根据一个默认的命令来生成这些.o文件。

这就是Makefile的核心, 其实难点是不在这里,难点是一些伪目标, 变量使用 ,以及一些函数, 知道了这些就可以知道整个工程的架构与流程(只要肯研究的话)。

最难得地方其实是 编译器(gcc /ld ....)的一些选项 天啊这几天被搞得晕晕的。

几个难点 再研究一下 以后再写了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: