![b3648881ed3f25a046e6e7873a38baa6.png](https://i-blog.csdnimg.cn/blog_migrate/88ddc8fbad7f8ec549fc326ad09b5217.jpeg)
本文首次编辑时间2020.07.20
最后编辑时间2020.08.03
欢迎转载,转载请附上原文链接
参考:
GNU make说明文档:https://www.gnu.org/software/make/manual/html_node/index.html#SEC_Contents
【跟我一起写Makefile】:https://seisman.github.io/how-to-write-makefile/
前言
Makefile的撰写只是为了自动化流程,如果是Windows 程序开发者,IDE(Integrated Development Environment)已经集成好了编译工具和make工具,不需要我们再手工编写Makefile。但是在嵌入式开发中,我们都会在Linux平台上进行开发然后交叉编译,这时就需要我们自己手工完成编译过程,所以Makefile必不可少。说开又说,学习Makefile是嵌入式开发者的必经之路,也只有清楚整个项目的编译过程,才能对嵌入式开发有更好的理解。本文不适合Makefile从零开始的开发者。这里只是以图表的形式对Makefile的编写做知识归纳,也方便自己以后复习和查找相关资料。
一、解释编译和链接
以C/C++代码为例,我们编写完代码后变成可执行文件需要经过编译和链接阶段。这个过程如果在Windows下是由IDE内置的编译器和链接器完成的。但是在Unix系统我们需要自己处理这个过程。以图解表示如下
![8078f8dd09a0708cf0718f27b75505da.png](https://i-blog.csdnimg.cn/blog_migrate/db92a36b974b43e5d66ec9a7e60d6c13.jpeg)
二、Make的工作流程
![3000b803a703de2f5e10c357b282a41f.png](https://i-blog.csdnimg.cn/blog_migrate/a4d61b43402aa331643891a2ec4e207a.jpeg)
在 Makefile 中,规则的顺序是很重要的,因为,Makefile 中只应该有一个最终目标,
其它的目标都是被这个目标所连带出来的,所以一定要让 make 知道你的最终目标是什么。
一般来说,定义在 Makefile 中的目标可能会有很多,但是第一条规则中的目标将被确立为
最终的目标。如果第一条规则中的目标有很多个,那么,第一个目标会成为最终的目标。 make所完成的也就是这个目标
三、书写依赖规则
make实际上只是检查Makefile里面的依赖关系(规则),然后决定哪一条规则下面的命令会被执行。命令执行成功与否make并不管
![4347bf4e83bd9aa7aa180cafb71ba5e1.png](https://i-blog.csdnimg.cn/blog_migrate/bbd7f1d340abf1de6bfdd4d12b3d2a22.jpeg)
四、书写命令
当make检查到某一条规则里,依赖文件比目标文件更新的情况时,就会执行该规则下的命令
![82ebb4465014227c25b57826e8b842dd.png](https://i-blog.csdnimg.cn/blog_migrate/a50536d80a8258a55b4d29628ca0e25d.jpeg)
五、使用变量
![7198de8fced273550677b7e5709a433c.png](https://i-blog.csdnimg.cn/blog_migrate/09054d715663ff9e5dbb599ed1675815.jpeg)
使用得最多最频繁的,可能是自动化变量了
![d5ea62fadba244b49d81b0f969c1505b.png](https://i-blog.csdnimg.cn/blog_migrate/6d2668d8222868c56a67af74c1dc9b56.jpeg)
六、使用函数
![c016021fab39b0fec2d36f62aeb43d2d.png](https://i-blog.csdnimg.cn/blog_migrate/5a04fae6f2ef3b6839ad824d3dc80ed3.jpeg)
![03af261f799de80ee06d20f08712a0be.png](https://i-blog.csdnimg.cn/blog_migrate/d0a287a4420d53862d1cfb3495c26508.jpeg)
![87fceb3e541ebfb5bad86c0e77b5eaec.png](https://i-blog.csdnimg.cn/blog_migrate/97a2beba8bc7f3d9c338fb58f348ca09.jpeg)