linux-----makefile文件的编写

makefile文件的编写

说道makefile文件,想必大家在学习 linux过程中都会遇到,今天我们来讲讲makefile文件

先简单的说说makefile是什么?makefile项目代码的管理工具,管理程序的源代码;

那我们为什么要写出makedile呢,原因在于如果我们需要做一个项目,项目里面包含了100个甚至更多的源文件,我们都知道,源文件编程我们要的可执行文件,就得进行预编译,编译,汇编,连接过程,在liunx系统下,这个时候我们要得到结果,我们就需要一个源文件一个一个的进行语句编译汇编处理,那为了简便这个过程,于是就有了makefile文件的产生;

举个例子说明一下吧,我们可以看到当前目录下有两个文件,一个是比大小main.c,一个是计算器Calculator.c,我们要实现他们就得一个一个进行源文件-> .o文件,再由.o文件->可执行文件;
在这里插入图片描述
而有了makefile文件我们就可以这么编写:
在这里插入图片描述
那么我们可以清晰的看到执行make命令后,我们的两个文件都编译汇编好了
相信大家一定很感兴趣,这个makefile文件时怎么编写的
记下来说一下makefile文件编写的规则:

目标(target) : 需要的条件(dependencies) (注意冒号两边有空格)
    命令(system command)  (注意前面用tab键开头)

eg:我写的这个makefile文件:
在这里插入图片描述

我们看到这,有的小伙伴救问了,如果我的源程序很多,那岂不是要敲出很多这个执行语句;
那接下来我就告诉你们怎么优化这个代码:
在这里插入图片描述
我们可以看到我们可以给目标赋值,而$就是去除包含的文件的内容,我们也能知道当上面的目标没有得到满足的需要的条件,就会向下检索,一直找到需要的文件 比如生成target目标需要main.o和test.o所以下面出现main.o和test.o的目标代码;其他诸如此类当最终目标文件依赖多个.o时,将依赖的多个.o 一起写到main: 后面,然后依次以目标:依赖文件 gcc… 的格式,罗列所有依赖关系;

由于在上面的过程中生成了多个中间.o文件(实际工程中肯定是比较多的),所以每次编译完成,后续基本还需要进行一定的清理工作,这时候就用上一个 “clean” (后面细说一下)来清理。

我的虚拟机出现了点问题 就不能使用包含的例子向大家展示,大家可以在下面多多试试;
在这里插入图片描述
这段代码中增加了clean功能,可以把多余的.o 文件删除;
注意: .PHONY意思表示clean是一个“伪目标”。也即是无论clean是否最新,一定执行它。rm命令前面加了一个小减号的意思就是,也许某些文件出现问题,但并不理睬。当然,clean的规则不要放在文件的开头,否则这就会变成make的默认目标,相信谁也不愿意这样。不成文的规矩是——“clean从来都是放在文件的最后”

其实还可以进行优化 但是我由于电脑的原因,知识点给大家理解:

从前面的makefile编写来看,  当中我们每写一个依赖关系就需要写一个形如gcc X.c  -o  X.o生成命令,这里还好,若是较大的工程,这样难免就太繁琐了,所以据了解,一般在公司专门编写makefile的人是不会那样写的。还有写着更简洁方式,就是利用下面这几个符号:
  $^    代表所有的依赖文件
  $@  代表所有的目标文件  
  $<   代表第一个依赖文件

关于clean:
   它只不过是一个动作名字,有点像c语言中的lable一样,其冒号后什么也没有,那么,make就不会自动去找它的依赖性,也就不会自动执行其后所定义的命令。要执行其后的命令(不仅用于clean,其他lable同样适用),就要在make命令后明显得指出这个lable的名字。这样的方法非常有用,我们可以在一个Makefile中定义不用的编译或是和编译无关的命令,比如程序的打包,程序的备份,等等。

那么我们已经简单的会写makefile文件了,那么makefile文件时怎么运行的呢:

1、make会在当前目录下找名字叫“Makefile”或“makefile”的文件。

2、如果找到,它会找文件中的第一个目标文件(target),在上面的例子中,他会找到“main”这个文件,并把这个文件作为最终的目标文件。

3、如果main文件不存在,或是main所依赖的后面的 .o 文件的文件修改时间要比main这个文件新,那么,它就会执行后面所定义的命令来生成main这个文件。

4、如果main所依赖的.o文件也不存在,那么make会在当前文件中找目标为.o文件的依赖性,如果找到则再根据那一个规则生成.o文件。(这有点像一个堆栈的过程)

5、当然,你的C文件和H文件是存在的啦,于是make会生成 .o 文件,然后再用 .o
文件生命make的终极任务,也就是执行文件main了。

这就是整个make的依赖性,make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。在找寻的过程中,如果出现错误,比如最后被依赖的文件找不到,那么make就会直接退出,并报错,而对于所定义的命令的错误,或是编译不成功,make根本不理。make只管文件的依赖性,即如果在我找了依赖关系之后,冒号后面的文件还是不在,那么对不起,我就不工作啦。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值