一文教你学会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》这本书!!!。

目录
相关文章
|
7月前
|
Linux 编译器 C语言
Linux应用开发基础知识——Makefile 的使用(二)
Linux应用开发基础知识——Makefile 的使用(二)
313 0
Linux应用开发基础知识——Makefile 的使用(二)
|
vr&ar
Makefile基础教学(预定义变量)
Makefile基础教学(预定义变量)
139 0
|
4月前
|
编译器 C语言
针对make工具和Makefile文件的学习心得
【8月更文挑战第24天】本文分享了关于 make 工具和 Makefile 文件的学习心得。make 工具与 Makefile 在软件开发特别是大型项目中扮演着重要角色,能自动化构建流程并提升开发效率。文章首先强调了了解 make 和 Makefile 重要性的必要性,并详细解析了 Makefile 的基本结构:包括目标、依赖和命令的定义;通过变量简化命令与依赖;以及伪目标的使用等。接着,文中介绍了几个关键的 Makefile 编写技巧:如何合理组织依赖关系,有效利用变量和宏,灵活运用自动变量,以及添加清晰的注释等。
|
IDE 编译器 程序员
Makefile零基础教学(一)初识makefile
Makefile零基础教学(一)初识makefile
177 1
Makefile零基础教学(一)初识makefile
|
存储 运维 编译器
Linux运维:makefile
Linux运维:makefile
111 0
|
Linux
Buildroot系列开发(四)Linux工具链剖析(下)
Buildroot系列开发(四)Linux工具链剖析
110 3
Buildroot系列开发(四)Linux工具链剖析(下)
|
程序员 编译器 Shell
一步步写属于自己的makefile
一步步写属于自己的makefile
|
自然语言处理 算法 NoSQL
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
217 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(二)
|
NoSQL Shell Linux
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
281 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(三)
|
Shell Linux 开发工具
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界
534 0
【六、深度解析Makefile】工程文件编译链接的“规则制定者”:带你走进 makefile 的世界(一)

相关课程

更多