Linux基础之makefile/make

目录

一、背景

 二、makefile和make的讲解

2.1 使用方法

2.2 伪目标文件

2.3 文件的属性以及属性的更新

2.4 makefile的自动推导


一、背景

这里会提及为什么要使用makefile和make,以及他们是什么和作用。

  • 会不会写makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。

简单来说:

makefile 是一个在当前目录下存在的一个具有特定格式的文本文件

make是一条指令

 二、makefile和make的讲解

2.1 使用方法

       既然makefile和make是这么好的一个工具,那我们该如何去使用他呢。莫急,且听我与你细细道来。首先在上文我们就说了,makefile是一个文件,那我们就得创建一个文件,且其命名必须为makefile(首字母可以大写)。例如我编写的这个:

        文件创建好了,那么其内容我们该怎么去编写呢,先看例子:

       这里先简单的说明一下这段代码是什么意思,随着我之后的讲解你们会逐渐地理解。 
       首先第一行代码,表明mybin和code.c具有依赖关系呢,这个大家慢慢就可以理解,其中 :左边的文件主要依赖于右边的文件,:右边可以有多个文件(先简单这样理解)。
       第二行代码,表面第一行依赖关系的依赖方法,通过这行代码我们也可以看出通过gcc指令将code.c编译生成mybin文件。
       第三行代码,表示clean是一个伪目标,这个下文我们会具体的说明。
       第四行代码,表示clean没有具体的依赖文件。
       第五行代码,同样表示其依赖方法,这里主要是删除mybin这个可执行文件。
接下来,让我们看看效果:
 
       可以发现,我们仅仅通过make指令就形成了我们的可执行文件,同样我们还通过make clean指令删除了我们的mybin文件。
       我相信细心的同学肯定会发现,为什么我们生成mybin文件的时候不需要写成make mybin呢?
这是因为当我们输入make指令时,其会自动在Makefile文件中从上自下的去检索第一个有效指令。如果我们把clean和mybin换一下位置,结果可就不一样了哦,大家可以自行尝试一下。

       我们其实还可以用其他方式来编写我们的makefile,这里我直接给大家上代码,再根据代码进行介绍。

      在编写makefile时,我们可以像前三行一样,去给我们的文件重新起一个名字,使用格式为 
$(+命名名字)。
      在看第一个关联关系,出现一个 $^ 和一个 $@ ,那这两个符号是什么意思呢。

$^ :表示关联关系的右边 即 :的右边

$@:表示关联关系的左边 即 :的左边

2.2 伪目标文件

在刚刚的代码中我们看到了这样一段代码:

首先将结论:

.PHONY 将clean修饰成了一个伪目标

那么这个伪目标有什么作用呢

作用:当被修饰成伪目标后,该指令可以总是被执行(依赖方法总是被执行的,不会被任何方式所拦截)

为什么要说可以总是被执行呢,难道系统还会拦截我们的指令不成,事实上确实时会的。例如:

       可以发现我们的make mybin在执行一次之后就不在让我们去执行了,而make clean 却可以反复的去执行。那这是为什么呢,系统是如何去拦截我们的命令的呢?,请看下文。

2.3 文件的属性以及属性的更新

首先我们来介绍一个指令:

stat + 文件名 ------------------可以查看一个文件的属性

例如我们现在就来看看刚刚通过make指令创建的code.c文件:

我们可以看到在文件中有很多属性,这里我们具体来说是后面三个。

Access : 访问时间。

Modify:最近一次文件内容被修改的时间

Change:最近一次文件属性被修改的时间
注意:文件 = 内容 + 属性

回归正题,为什么make/makefile总是不让我们重新编译代码?

       其实这是为了去提高我们的编译效率。如果我们的源代码什么都没改,那么我们一直的反复编译时没有任何意义的,所以其总是不让我们重新编译代码。

那么其是怎么做到这一点的呢?

       主要通过一个文件的修改时间,光一个时间有什么用呢。所以时间并不是本质,通过时间对比出文件的新旧才是本质(更新后的文件才有重新编译的价值)。那么其和谁去对比呢?不要忘了,我们生成的可执行程序也是一个文件,要知道重新编译的本质不就是重新写入一个二进制可执行文件吗,那么其的修改时间就一定会更改。
        这里还有一个逻辑,第一次编译的时候,一定是先有的源文件,才有的bin文件,那么
源文件的修改时间一定会小于bin文件的修改时间。那么在之后,我们对源文件做修改的时候一定有,源文件的修改时间大于bin文件的修改时间(此时还没进行编译)。这样不就可以对比出文件的新旧,进而去达到防止我们对一个文件反复编译的效果了吗。

       这里重新介绍一下touch,其还可以更新一个文件的时间。可以用man指令进行查看。(我这只截取了一部分)

可以看到 -a是修改访问时间,-m是修改mtime。

       我们在这里可以通过这个指令来印证上面我们所说的。
这个时候是不让make的:

其时间属性如下:

接着我们touch一下,然后再次观察code.c的时间属性:

可以很明显的发现其发生了变化,我们在试一试可不可以make:

实验成功,刚好印证了我们上面所说。

补充:

       我们所看到的文件,一般在哪里存放着呢?一般是放在磁盘,更改文件时间的本质其实就是访问磁盘。其实系统不是很愿意去访问外设的,因为很慢,会导致效率的降低。但是一般而言,一个文件被查看的频率是非常高的(不是用户访问),如果每次都要去更改Access的话,会导致Linux系统充满大量的访问磁盘的IO操作,变相的减慢系统效率。为了减少这样的访问,系统设置了一个每经过一定次数的查看,再进行一次修改Access的操作。

2.4 makefile的自动推导

这里我们同样先用代码举例:

       这段代码很有意思,当我们要创建mybin时,目录中却没有code.o,怎么办,那么他就会在makefile中从上至下的去找,看有没有关于code.o的依赖关系,很明显根据这段代码他一直会往下找,直到遇到code.c(该文件在目录中存在),这往下找的过程其实可以看做时一个入栈的过程,而当找到code.c,那么接下来就会相当于一个出栈的过程一直生成所要的文件。
        这部分过程可以看做makefile/make的推导能力(当然这只是很小的一部分)。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/596817.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宝兰德通过广东教育行业信创适配认证,拓展教育信创生态圈

近日,由宝兰德自主研发的多款中间件产品通过广东省教育行业信创适配中心的适配测试。测试表明,宝兰德四款中间件产品(分布式缓存软件V3.0、应用服务器软件V9.5、消息中间件软件 V2.1、Web服务器软件V3.1) 与当前主流国产操作系统统…

memory consistency

memory consistency model 定义了对于programmer和implementor来说,访问shared memory system的行为; 对于programmer而言,他知道期望值是什么, 知道会返回什么样的数据;; 对于implementro而言,…

数据结构——链表专题1

文章目录 一、移除链表元素二、反转链表三、合并两个有序链表四、链表的中间节点五、环形链表的约瑟夫问题六、分割链表 一、移除链表元素 原题链接:移除链表元素 一个解法是遍历原链表,将与val相等的结点抛弃,链接后一个结点 另一个解法是…

corefBERT论文阅读

CorefBERT是清华大学团队发表的,继SpanBERT之后另一针对共指消解的BERT模型。共指消解任务对于文本理解、智能问答等其他NLP子任务起到至关重要的作用。 为了提高语言模型的共指推理能力,一个简单的解决方案是使用有监督的共指解析数据在bert等模型进行…

论文笔记ColdDTA:利用数据增强和基于注意力的特征融合进行药物靶标结合亲和力预测

ColdDTA发表在Computers in Biology and Medicine 的一篇一区文章 突出 • 数据增强和基于注意力的特征融合用于药物靶点结合亲和力预测。 • 与其他方法相比,它在 Davis、KIBA 和 BindingDB 数据集上显示出竞争性能。 • 可视化模型权重可以获得可解释的见解。 …

Linux网络部分——DNS域名解析服务

目录 1. 域名结构 2. 系统根据域名查找IP地址的过程 3.DNS域名解析方式 4.DNS域名解析的工作原理【☆】 5.域名解析查询方式 6.搭建主从DNS域名服务器 ①初始化操作主服务器和从服务器,安装BIND软件 ②修改主服务器的主配置文件、区域配置文件、区域数…

【c1】数据类型,运算符/循环,数组/指针,结构体,main参数,static/extern,typedef

文章目录 1.数据类型:编译器(compiler)与解释器(interpreter),中文里的汉字和标点符号是两个字节,不能算一个字符(单引号)2.运算符/循环:sizeof/size_t3.数组…

基于java的CRM客户关系管理系统的设计与实现(论文 + 源码 )

【免费】基于Java的CRM客户关系管理系统的设计和实现.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89273409 基于Java的CRM客户关系管理系统的设计与实现 摘 要 随着互联网的高速发展,市场经济的信息化,让企业之间的竞争变得&#xff0…

复写零(双指针)

下面的解法需要手动画图,举例去体会,只有自己手动去做了,才会有所收获。 class Solution {public void duplicateZeros(int[] arr) {int n arr.length;//先找到最后一个元素的位置;//至于为什么要直接先设dest 为-1,这是经过研究…

CNN笔记详解

CNN(卷积神经网络) 计算机视觉,当你们听到这一概念的是否好奇计算机到底是怎样知道这个图片是什么的呢?为此提出了卷积神经网络,通过卷积神经网络,计算机就可以识别出图片中的特征,从而识别出图片中的物体。看到这里充…

分布式与一致性协议之ZAB协议(四)

ZAB协议 ZooKeeper是如何选举领导者的。 首先我们来看看ZooKeeper是如何实现成员身份的? 在ZooKeeper中,成员状态是在QuorumPeer.java中实现的,为枚举型变量 public enum ServerState { LOOKING, FOLLOWING, LEADING, OBSERVING }其实&…

为何美国多IP服务器是全自动内容采集站的最佳选择?

为何美国多IP服务器是全自动内容采集站的最佳选择? 在建设全自动内容采集站时,选择合适的服务器至关重要。而在众多选项中,美国多IP服务器被认为是最佳选择,究竟为何呢?本文将从多个方面进行深入探讨。 为何美国多IP服务器是全自动内容采集…

分享8000网剧资源

兄弟们,前段时间搞短剧,收集了8500多部网剧资源。搞了整整两个月就赚3块两毛八,电费都不够。还不如进厂打螺丝。果断放弃这项目。 资源在手里面也没啥用。分享出来,大家看着玩。 有其他好的网络项目也可以分享分享。也可也一起…

真希望我父母读过这本书的笔记(二)

系列文章目录 真希望我父母读过这本书的笔记(一) 真希望我父母读过这本书的笔记(二) 文章目录 系列文章目录PART 5 培养心理健康的孩子亲子关系决定心理健康互动及来回交流如何开始交流互看游戏交流恐惧症 若遇棘手之际&#xff0…

9.Admin后台系统

9. Admin后台系统 Admin后台系统也称为网站后台管理系统, 主要对网站的信息进行管理, 如文字, 图片, 影音和其他日常使用的文件的发布, 更新, 删除等操作, 也包括功能信息的统计和管理, 如用户信息, 订单信息和访客信息等. 简单来说, 它是对网站数据库和文件进行快速操作和管…

[Flutter]创建一个私有包并使用

在Flutter中创建一个自己的私有组件(通常称为包或库),并通过Dart的包管理工具pub进行使用。 一、创建一个新的Flutter包 1.使用命令行创建 使用Flutter命令行工具来创建一个新的包: $ flutter create --templatepackage my_pri…

嵌入式复习重点

嵌入式系统有多种表现形式,包括计算机MCU、SOC片上系统、SOPC片上系统、GPU和FPGA等。 MCU(微控制器): 是最基本也是最常见的嵌入式系统形式,是集成了CPU、ROM、RAM、IO口、定时器、中断控制器等组件的单一芯片。MCU广泛用于电器电子产品的控制。SoC(系统片上芯片):…

P8800 [蓝桥杯 2022 国 B] 卡牌

P8800 [蓝桥杯 2022 国 B] 卡牌 分析 “最多” -- 二分 1.二分区间(凑齐的卡牌套数): l:a[]min;r:(a[]b[])max 2.check(x): (1)for循环内: 判断x - a[i…

Enhancing Diffusion——利用三维透视几何约束增强扩散模型

概述 透视在艺术中被广泛研究,但现代高质量图像生成方法却缺乏透视精度。新的生成模型引入了几何约束,通过训练过程提高透视精度。这样可以生成更逼真的图像,并提高相关深度估计模型的性能。 最近的图像生成技术使研究人员能够创造性地进行…

茅台葡萄酒打出节日新式营销“组合拳”,两月内落地品鉴会超千桌

执笔 | 尼 奥 编辑 | 古利特 2024年1-3月酒类进出口数据显示,葡萄酒进口量微增3.66%,进口额同比下滑11%,一季度整体跌势大缓,逐步走出普遍低迷的行情。与之相反的是,作为国产葡萄酒代表的茅台葡萄酒继续保持向上的战…