从今天开始,我们来学习 makefile 了。那么什么是 make 呢?为什么需要 make 呢?在我们之前学习的 C 语言以及 C++ 语言中,我们在编译的时候只需要 gcc 或者 g++ 命令就可以完成源码的编译了。但是在嵌入式中一些大型的项目中,如内核的编译,动辄上万个源文件,我们还可能去一行一行的敲 gcc 命令吗?肯定不会了,这时我们便需要一个工具来进行代替了,此时便需要 makefile 了。
本系列博客内容是根据狄泰软件学院的《门徒计划》中的 makefile 相关内容总结而来,狄泰技术交流群:199546072。
make 是一个应用程序,它的作用是:a> 解析源程序之间的依赖关系;b> 根据依赖关系自动维护编译工作;c> 执行宿主操作系统中的各种命令。makefile 是一个描述文件,它的作用是:a> 定义一系列的规则来指定源文件编译的先后顺序;b> 拥有特定的语法规则,支持函数定义和函数调用;c> 能够直接集成操作系统中的各种命令。那么 make 和 makefile 之间的关系是怎样的呢?makefile 中的描述用于指导 make 程序如何完成工作;make 根据 makefile 中的规则执行命令,最后完成编译输出。如下所示
下来我们来看看最简单的 makefile 示例,如下
注意:目标 hello 后的命令需要用 Tab 键(' \t')隔开!make 程序的使用示例:make -f mf.txt hello,功能说明:以 hello 关键字作为目标查找 mf.txt 文件,并执行 hello 处的命令。它还有种简写:make hello,功能说明:以 hello 关键字作为目标查找 makefile 或 Makefile 文件,并执行 hello 处的命令。还有种写法是 make,功能说明:查找 makefile 或 Makefile 文件中最顶层目标,并执行最顶层目标的命令。
下来我们就来看看 makefile 是怎样用的,在 hello.txt 文件中编写代码
hello : echo "hello makefile"
我们来看看编译效果是怎样的
我们来试试将 hello 后面的 Tab 键换成四个空格键看看编译还会通过吗?
我们看到直接出错了,所以大家一定要记得在 makefile 中目标后面的一定是 Tab 键。我们前面说还有种简写,是 make hello,我们来试试
我们看到没有相应规则,原来是它会去在当前目录下查找 makefile 或 Makefile 文件,下来我们将 hello.txt 文件名改为 makefile 试试呢
我们看到再次执行是正确的。我们前面说的直接执行 make 时,它默认执行的是最顶层的目标,那么意思是还会有别的目标。我们再来试试在 makefile 文件中添加 test 目标,还是打印 hello test。执行 make 看看
还是正确打印出了结果,说明 makefile 中是支持这种写法的,支持多个目标的同时定义。我们来试试 make test 呢
我们再来添加两句,pwd 和 ls 命令,最终程序将会变成下面这样
hello : echo "hello makefile" test : echo "hello test" pwd ls
看看编译结果
我们看到它会依次执行目标后的命令。pwd 命令的意思是打印文件所在目录,ls 是显示当前文件下的所有文件。通过对 make 和 makefile 的学习,总结如下:1、make 只是一个特殊功能的应用程序;2、make 用于根据指定的目标执行相应的命令;3、makefile 用于定义目标和实现目标所需的命令;4、makefile 有特定的语法规则,支持函数定义和调用。
欢迎大家一起来学习 makefile,可以加我QQ:243343083。
原文地址:http://blog.51cto.com/12810168/2126643