【Linux】make下令 | makefile文件详解

打印 上一主题 下一主题

主题 929|帖子 929|积分 2787

目录

前言:
一、预览功能
二、依赖关系和依赖方法
三、清理项目
四、makefile中写入其他Linux下令
五、PHONY关键字 
1.文件时间信息(stat下令)
六、makefile实行下令序次
七、makefile使用本领
八、天生多个可实行文件
总结:


前言:

我们是否可以在Linux上面不安装编译器,也可以使每次写的代码编译运行?也就是不消每次都是用gcc编译出一个可实行文件,之后修改了源文件之后又删除天生的可实行文件再gcc天生可实行文件。
接下来我们就来详细解说两个相干的知识:make下令和makefile。他们可以快速的提升编程服从。
一、预览功能

我们先来预览一下他们的团体功能。此时我们写一个proc.c文件,并在里面写入一些内容:

此时我们新建一个Makefile/makefile文件,这两个名字都可以。并向Makefile中写入以下内容:

此时我们直接在下令行中输入make,就会发现天生了一个proc可实行文件。 

此时你大概会说,这看起来步骤反而变多了,没错,到这步确实是变多了,但是我们接下来要深入学习你就会发现,这个文件真的用起来很爽。
二、依赖关系和依赖方法

我们来看一下makefile文件中的语句分解:

什么是依赖关系?什么是依赖方法? 
   打个比方:你和你爹,这个就是依赖关系;此时你问你爹要钱,这个就是依赖方法。
  以是必须现有依赖关系,之后才有依赖方法(大家不要想的很复杂) 。
此时就好解释了:形成proc可实行步伐依赖proc.c,以是互不可缺;但是只有依赖关系不行,我们还要有依赖方法,要表明如何形成可实行步伐。
makefile本质就是依赖方法的聚集。
三、清理项目

如何清理项目?此时我们在Makefile中再参加如下几条语句:
  1. .PHONY:clear
  2. clear:
  3.     rm -f proc
复制代码

之后实行如下下令(make clear):

这里大家肯定都一头雾水,这是为啥?(插一句:phony假的)

留意这里的定名可以更改,比如:


你可以发现clear目的文件右边没有依赖文件。
此时你会好奇,岂非第一次直接make就可以天生可实行文件吗?可不可以make proc?其实也可以:

这是由于makefile文件是从上到下扫描的,第一行的依赖关系make proc中的proc可以省略掉。
以是我们也可以把clear放在首行,比如我们作出以下修改:

但是我们一样平常建议把清理下令(清理的依赖关系)放在最后。
   小总结:makefile文件,会被make从上到下开始扫描,第一个目的名,是可以直接用make省略目的名形成的;假如我们要实行其他组的依赖关系和依赖方法:make name.
  四、makefile中写入其他Linux下令

此时你会想:rm 了、gcc 了这些下令归根结底还是Linux中的下令行,那么是不是我们在依赖方法中写入也可以实行呢?
此时我们先补充一下:#在makefile文件中可以注释。
此时我们将Makefile的内容做以下修改:

但是还是很烦,由于每次把下令行也显示出来了,此时我们要将下令行隐藏。隐藏下令行要使用@符号(@是关闭下令回显)。

唉!此时是不是可以增加一些提示信息呢?比如:

此时我们故意项文件中参加报错信息,看看运行结果:

此时我们修正代码:

五、PHONY关键字 

此时我们不停实行make下令看看是什么效果:

再不停实行make clear下令: 

此时把PHONY语句给注释了并再次不停实行make clear下令:

我们可以发现,似乎有PHONY和没有它都一样,这里我们把PHONY放到第一行并观察实行结果。

此时我们发现,用PHONY修饰第一行依赖关系的目的文件,每次都可以实行。以是.PHONY让目的文件对应的方法,总是被实行。此时我们再来看一个征象:

偶然候必要重新编译,偶然候不必要,这是为什么?
1.文件时间信息(stat下令)

对于源文件和可实行文件,都是文件。
文件 = 内容 + 属性
我们用stat下令来检察一个文件或文件系统的状态信息:

至于Access对应的时间是文件被访问的时间,由于这个频率太高了,频仍修改影响服从,以是它的修改时间我们不做讨论。 
此时我们先修改proc.c权限,之后修改proc.c内容:

此时我们来对比proc和proc.c文件的时间区别: 


这里再回到之前的问题,此时我们再Makefile中将PHONY放在第一行,并把PHONY修饰的clear给删除:

PHONY让依赖方法忽略掉时间对比,但是为什么make clear却不停实行呢?由于clear中的依赖方法rm -f file本身就不关心时间。以是可以不停实行make clear。
六、makefile实行下令序次

我们之前在gcc章节讲到过(vim编辑器和gcc编译器-CSDN博客),天生一个可实行文件是颠末预编译、编译、汇编、链接的步骤的。我们可以在makefile中把详细的实行步骤写入:

Makefile实行序次为从上到下实行,此时文件中它先找有没有proc.o依赖文件,没有将的话会将依赖方法放入栈中……如下图: 

make解释makefile的时候,是会自动推导的,不停推导,此时不会实行依赖方法(将依赖方法放入栈中),直到推导到有依赖文件的存在,然后逆向实行所有依赖方法。
   这里插一句,我们假如没有目的文件直接-c会直接天生同名汇编的.o文件:
  

  但是我们一样平常不会这么写,太冗长了,我们一样平常如许写:

这是由于你在Windows中,一样平常天生可实行文件时,是会天生一个同名的.obj文件的,以是我们一样平常会如许写makefile。
七、makefile使用本领

当我们写一个项目时,大概不止一个.c文件,此时假如我们想像C语言一样,可以使用宏更换,假如要修改文件,只必要把宏给更换即可,不必要一个一个更换变量,makefile可以吗?当然可以,由于makefile支持通配符,以是可以如许使用:

makefile也可以界说变量,可以不消带类型。此时我们再修改一下makefile文件:


由于将来我们不大概只有一个.c文件,以是利用此方法有点像C语言中的宏界说。
而且我们还可以如许修改: 



以是终极的makefile版本应该这么写。 
八、天生多个可实行文件

此时我们再写一个code.c文件,并修改makefile文件:

此时可以发现只形成了一个proc可实行文件,由于我们在Windows中也是默认形成一个,但是Linux中可以一次形成多个,此时就必要使用其他本领了:

天生all就要天生proc和code,此时没有源文件,之后继续向下实行依赖方法(依赖方法入栈),终极会天生proc和code可实行文件,并天生all目的文件。
总结:

此时我们已司明白了大部分的makefile的原理,当前知识已经完全够我们使用,接下来我们先利用这些已学过的知识来完成一个进度条小项目(下一篇敬请期待)。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

徐锦洪

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表