一文教你学会Makefile脚本的简单应用

简介: 一文教你学会Makefile脚本的简单应用


一.什么是Makefile脚本

Makefile其实就是一种脚本语言,跟python脚本一样,方便你程序的开发。当我们编译的文件过多,而又需要经常编译的时候就需要写Makefile脚本语言。或者方便别人去编译你的程序(其他人不知道如何编译),拿到你的Makefile文件后,只需要make一下,程序就编译出来了。

二.Makefile语法

Makefile包含一系列规则。如下

目标(target):依赖(prerequiries)

tab键+命令

它是如何执行的呢,当依赖文件发生改变的时候就会执行命令!这样说可能有点抽象,那么举个例子。

左边main.c文件,右边Makefile文件。

我们先make一下,看看发生什么。

make 之后就生成了main可执行文件。现在解释一下上诉的Makefile语法。目标,依赖,命令之间的关系,当依赖文件发生改变时,就会执行命令,重新生成依赖。所以我们上述脚本就是当main.c发生改变时,make一下就能重新生成main可执行文件。那么如果我再make一下会发生什么呢?

可以看到因为main.c文件没有改变,所以make一下并没有效果。你们可以去试一下改变main.c文件再去执行一下make。看看是不是重新生成了main可执行文件。

三.使用Makefile编译多个文件

我们先创建3个文件 1.c, 2.c ,3.c 和一个Makefile文件

然后编写Makefile脚本

我们先生成.o文件(目标文件),最后再进行链接成可执行文件,这样做有什么好处了,就是当一个.c文件发生改变时,其他文件只需要执行最后一步链接成main可执行文件,而不需要重新生成.o目标文件。在这个实验中区别不到,如果是比较大的项目,可能就几千上万个.c文件(比如linux内核源码),这样就大大提高了效率。

3.1 运行脚本

注意:我们这里只是测试,并没有写1.c ,2.c, 3.c 里面的内容。现在我们make一下

可以看到执行了以下语句,符合我们的预期。

3.2 利用Makefile删除不必要文件

我们只想生成main可执行文件,但是生成了很多不必要中间文件(1.o,2.o,3.o)。我们此时可以使用一个Makefile语法删除掉不需要的文件。

修改Makefile 文件

然后执行make clear,发现执行了 rm 1.o 2.o 3.o

注意:这里.PHONY:是固定的,clear:可以换成其他如XX: 最后执行make XX即可。

四.Makefile进阶语法

前面几个语法只是Make执行规则,下面提几个进阶语法,基本就能看懂别人写好的Makefile脚本了

4.1在Makefile中使用变量

如在上面实例中,1.o,2.o,2.o使用了三次,这里我们可以用变量替代,减少工作量(如调大型脚本调用多次的时候)下面是示例。

我们使用变量object(随便命名即可)来保存值,最后$(object)就能取到值。

我们make一下,发现效果一样。

4.2 Makefile中通配符

如 *.o代码当前目录下所有后缀为.o的文件.Makefile也可以修改为这样。

五.总结

本文就讲这么多了,只涉及一点基础,适合小白,如果需要深入了解Makefile,博主推荐去看《跟我一起学Makefile》这本书!!!。

目录
相关文章
|
4月前
|
存储 人工智能 算法
技术经验分享:7z命令行压缩解压详解
技术经验分享:7z命令行压缩解压详解
130 0
|
IDE 编译器 程序员
Makefile零基础教学(一)初识makefile
Makefile零基础教学(一)初识makefile
166 1
Makefile零基础教学(一)初识makefile
|
存储 运维 编译器
Linux运维:makefile
Linux运维:makefile
102 0
|
Linux
Buildroot系列开发(四)Linux工具链剖析(下)
Buildroot系列开发(四)Linux工具链剖析
102 3
Buildroot系列开发(四)Linux工具链剖析(下)
|
Shell Linux 开发工具
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
506 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)
|
自然语言处理 算法 NoSQL
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
196 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
|
NoSQL Shell Linux
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
257 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
|
Linux 开发工具
Buildroot系列开发(四)Linux工具链剖析(上)
Buildroot系列开发(四)Linux工具链剖析
154 0
Buildroot系列开发(四)Linux工具链剖析(上)