Makefile编译初识及使用

Makefile编译初识及使用

Makefile的作用及意义: 当我们在Linux系统下进行C语言编译时,我们可以通过gcc命令来完成C文件的编译,直至生成一个最终的可执行文件。当我们的工程只有一两个C文件还好,我们需要输入的gcc编译命令并不多,而当我们的工程有几十个、上百个甚至上万个文件时那么使用终端的GCC命令来进行逐个的编译是不现实的。并且,如果我们的工程文件中仅有一个或者少数的文件被更改时,我们又需要将整个工程的文件重新编译链接一遍,这将耗费巨大的精力与时间成本。按照文件的编译流程来看,一个程序文件从初始的高级语言状态到最终的机器可执行文件状态需要通过编译器来进行操作。试想,当我们的工程中仅有一两个文件被修改时,我们仅对这一两个文件进行编译,并且最终进行整体的链接,而且这一整个过程仅通过一行命令进行实现,那么这样是会节省我们很多的精力的。于是,Makefile应运而生,Makefile是存在于工程文件夹下的一个 文本文件 ,其内含有对整个工程文件的编译顺序描述及依赖判定,通过工程内的Makefile文件,当我们工程中的一个或多个文件被修改时,我们可以在Linux系统下仅使用命令 ”make” 来对整个工程文件进行编译与链接。Makefile文件需要事先编写,但是一经编写完成,整个工程就只需要一个 “make” 命令来实现自动化的编译、链接、生成可执行文件这一流程。
在这里插入图片描述

Makefile文件的语法规则:

目标...: 依赖文件集合...
	命令1
	命令2
	......

(注意: Makefile文件中的每条命令必须是以TAB作为行首缩进的,Makefile会将TAB缩进的行视为命令指令行来进行执行)

假设我们有一个工程,其内有以下C文件:
在这里插入图片描述
由上图可知,我们在工程文件夹内创建了一个名称为 “Makefile” 的文件,这个文件就是Makefile的规则描述文本,其文件名称固定为此,不可改变(也可为makefile)。

clean代表着Makefile文件中的一个函数,由图所示,我们可以通过以下的Bash命令来对工程文件夹中的 “.o” 中间文件及可执行文件 main 进行清理。

make clean

在这里插入图片描述
Makefile编译规则文件的内容如上图所示。第1-2行、3-4行、5-6行、7-8行、10-12行皆是我们Makefile文件内的 “规则”

第1行是我们的 “终极目标”,即最终编译出可执行文件 “main”。其后跟着的是生成这个文件所需要的依赖文件,初始时我们的工程中还没有这些文件,于是Makefile继续向下查询这些文件,查询到后则会执行其下的 gcc 命令行。当所有依赖文件都被生成出来后,第一行的终极目标就被达成了

make命令: 当我们在工程文件夹中使用 make 命令时,该命令会在当前的工程文件夹下寻找名称为Makefile(或makefile)的规则文件,当发现该文件后就会按照Makefile内定义的规则去编译生成最终的目标文件。当发现目标文件不存在,或者目标所依赖的文件比目标文件新(也就是最后修改时间比
目标文件晚)的话就会执行后面的命令来更新目标。

这就是 make 的执行过程,make 工具就是在 Makefile 中一层一层的查找依赖关系,并执行
相应的命令。编译出最终的可执行文件。Makefile的好处就是“自动化编译”,一旦写好了Makefile
文件,以后只需要一个 make 命令即可完成整个工程的编译,极大的提高了开发效率。

(在本节,我们仅对Makefile作初始的使用介绍,在之后会对其使用作深入的讨论)

变量及自动化变量: 以上的Makefile还可以使用其内的 “” 及 “自动化变量” 作进一步的优化操作,如下图所示。

在这里插入图片描述
其中 “$<” 是Makefile中的一个自动化变量,代表所有符合模式规则的一系列文件的集合。

其中 “%” 代表长度任意的非空字符串,图中的 “%.c” 代表所有以 “.c” 结尾的文件. “%.o” 代表

所有以 “.o” 结尾的文件。**同理,**当 “%” 前有字符时则会筛选出所有以该字符为开头的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值