Makefile:Makefile的工作原理、变量和清理功能


1、写在前面的话

这篇博客主要讲下Makefile的工作原理和变量的基本使用,内容不是很多,属于较为简单的东西。


2、Makefile的工作原理

一般地,我们输入make命令,系统默认回去执行以下步骤:
01 make会在当前目录下找名字叫“Makefile”或“makefile”的文件,平时建立文件可以直接用Makefile的名字,大写字母比较显目。
02 如果找到,它会找文件中的第一个目标文件(target),并且把这个文件作为最终的目标文件。
03 如果该文件不存在,或是其所依赖的后面的.o文件的文件修改时间要比其新,它就会执行后面所定义的命令来生成新的第一个目标文件。
04 如果第一个目标文件所依赖的**.o文件也存在**,那么make会在当前文件中找目标为.o文件的依赖性,根据之前的新旧或是否存在的规则,来生成新的.o文件。
备注:make会一层层地去寻找文件的依赖关系,直到编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,make会直接退出,并且报错。而对于所定义的命令错误,或者编译不成功,make根本不理,make只管文件的依赖性。


3、Makefile的变量使用

引例:

edit : main.o kbd.o command.o
gcc -o edit main.o kbd.o command.o

解析:可以看到[.o]文件的字符串被重复了两次,如果我们的工程需要加入一个新的[.o]文件,需要在两个地方加(应该是三个地方,还有一个地方在clean中)。这个makefile并不复杂,在两个地方加也不累,但如果makefile变得复杂,那么就有可能会忘掉一个需要加入的地方,而导致编译失败。所以,为了makefile的易维护,在makefile中我们可以使用变量。makefile的变量也就是一个字符串,理解成C语言中的宏可能会更好

示例:比如,我们声明一个变量,叫objects,OBJECTS,objs,OBJS,obj,或是OBJ,反正不管什么,只要能够表示obj文件就行了,可以在makefile一开始就这样定义:

objects = main.o kbd.o command.o

于是,就可以很方便地在我们的makefile中以“$(objects)”的方式来使用这个变量了,改良版makefile就变成下面这个样子:

objects = main.o kbd.o command.o
edit : $(objects)
gcc -o $(objects)

4、清空目标文件的规则

每个Makefile中都应该写一个清空目标文件(.o 和执行文件)的规则,这不仅便于重编译,也很利于保持文件的清洁,这是“编程的修养”。

用法:
一般的风格都是:

clean:
	rm edit $(objects)

更为稳健的做法是:

.PHONY: clean
clean:
	-rm edit $(objects)

说明:前面说过,.PHONY意思表示clean是一个“伪目标”,而在rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但不要管,继续做后面的事。当然,clean的规则不要放在文件的开头,不然,这就会变成 make 的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean 从来都是放在文件的最后”


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

学不懂啊阿田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值