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.mzph.cn/pingmian/7250.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

怎么口语外教一对一课程?这篇文章告诉你答案!

怎么口语外教一对一课程?在当今全球化的时代,英语口语能力已经成为许多人追求的重要技能。为了满足这一需求,市场上涌现出了许多提供一对一口语外教课程的软件。这些软件不仅提供了与母语为英语的外教进行实时交流的机会,还通过互…

遭遇.halo勒索病毒怎么办?如何识别和应对.halo勒索病毒

导言: 近年来,网络安全问题愈发严峻,其中勒索病毒成为了威胁企业和个人数据安全的重要隐患。在2023年初,一种新的勒索病毒——.halo勒索病毒开始在网络上肆虐,给广大用户带来了极大的困扰。本文91数据恢复将对.halo勒…

c3 笔记6 认识css样式表

<link>与import应该如何选择?事实上&#xff0c;使用link与import链接外部样式文件的效果看起来是一样的&#xff0c;区别在于<link>是HTML标记而import属于CSS语法。<link>标记有rel、type与href属性&#xff0c;可以指定CSS样式表的名称&#xff0c;这样就…

控制台调试 hover 后才出现的元素

调试 hover后才出现的元素 打开开发者工具&#xff0c;鼠标放在hover时才出现的元素上&#xff0c;然后点击右键&#xff1b; 不要选中任何选项&#xff0c;将鼠标移动到开发者工具的调试面板中&#xff1b; 按下N键&#xff0c;此时悬浮的元素不会消失&#xff0c;定位成功。…

知到java笔记(4.1--继承的用法以及this和super的用法)

格式&#xff1a; 例子&#xff1a; get set获取父类的私有变量 private属性 this和super区别&#xff1a; this用法 super用法 例子

计算机毕设

随着社会和国家的重视&#xff0c;大学对于大学生毕业设计越来越重视。 做软件设计设计方面&#xff0c;前后端分离是必不可少的&#xff0c;代码管理工具&#xff0c;前后端接口测试是项目中必须要用到的工具。做大数据设计方面&#xff0c;主要是要用到爬虫进行数据爬取&…

【数据分析面试】36.SAAS公司邮件营销策略分析(业务分析)

题目 假设你在一个B2B SAAS公司营销团队工作。本季度即将结束&#xff0c;但当前收入距离预期目标还差10%。营销团队的一个高管要求负责电子邮件营销的人向所有客户群发邮件&#xff0c;要求他们购买更多产品。这是个好主意吗&#xff1f;为什么&#xff1f; 提示1&#xff1…

[论文笔记]Longformer: The Long-Document Transformer

引言 今天带来论文Longformer: The Long-Document Transformer的笔记。 基于Transformer的模型由于其自注意力操作而无法处理长序列&#xff0c;该操作随着序列长度呈二次扩展。为了解决这一限制&#xff0c;本篇工作提出了Longformer&#xff0c;其注意力机制随着序列长度呈…

接口测试之Mock测试方法

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 一、关于Mock测试 1、什么是Mock测试&#xff1f; Mock 测试就是在测试过程中&#xff0c;对于…

跟TED演讲学英文:How to govern AI — even if it‘s hard to predict by Helen Toner

How to govern AI — even if it’s hard to predict Link: https://www.ted.com/talks/helen_toner_how_to_govern_ai_even_if_it_s_hard_to_predict? Speaker: Helen Toner Date: April 2024 文章目录 How to govern AI — even if its hard to predictIntroductionVocabu…

美业SaaS系统多门店收银系统源码-【分润常见问题】讲解(一)

美业管理系统源码 博弈美业SaaS系统 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ▶ 分润常见问题&#xff1a; 1、分润金额基数 所有分润计算的基数均为平台订单中各个商…

解决 java: 非法字符: ‘\ufeff‘

【报错解释】&#xff1a; 该错误通常发生在尝试编译Java源代码文件时&#xff0c;文件开头的字符是一个字节顺序标记&#xff08;Byte Order Mark&#xff0c;BOM&#xff09;&#xff0c;即\ufeff。在Java中&#xff0c;\ufeff不是一个合法的字符&#xff0c;因此编译器会报…

不考408的985,不想考408的有福了!吉林大学计算机考研考情分析

吉林大学&#xff08;Jilin University&#xff09;简称吉大&#xff0c;位于吉林长春&#xff0c;始建于1946年&#xff0c;是中华人民共和国教育部直属的综合性全国重点大学&#xff0c;国家“双一流”、“211工程”、“985工程”、“2011计划”重点建设的著名学府&#xff0…

open-webui+ollama本地部署Llama3

前言 Meta Llama 3 是由 Meta 公司发布的下一代大型语言模型&#xff0c;拥有 80 亿和 700 亿参数两种版本&#xff0c;号称是最强大的开源语言模型。它在多个基准测试中超越了谷歌的 Gemma 7B 和 Mistral 7B Instruct 模型。 安装 1.gpt4all https://github.com/nomic-ai/…

[Unity常见小问题]打包ios后无法修改模型透明度

问题 在Editor下可以使用如下代码去修改模型的材质的透明度&#xff0c;但是打包ios后无法对透明度进行修改且没有任何warning和error using System.Collections; using System.Collections.Generic; using UnityEngine;public class NewBehaviourScript : MonoBehaviour {[R…

Word页脚设置“第X页共X页”的方法【域实现】

Word页脚设置“第X页共X页”的方法【域实现】 在设置Word页码格式的要求中&#xff0c;有时需要设置为“第X页共X页”这种格式&#xff0c;使用Word中的域功能可实现&#xff0c;同时&#xff0c;在某些情况下&#xff0c;可能还需要减去封面的页码&#xff0c;接下来为具体步…

i.MX 6ULL 裸机 IAR 环境安装

一. IAR 的安装请自行搜索 二. 使用最新版本的 IAR&#xff0c;需要修改 SDK 1. 在 SDK 的 core_ca7.h 加上 #include "intrinsics.h" /* IAR Intrinsics */ 2. debug 时需要修改每个工程下的 ddr_init.jlinkscript&#xff0c;参考链接 Solved: How to conn…

五月节放假作业讲解

目录 作业1&#xff1a; 问题&#xff1a; 结果如下 作业2&#xff1a; 结果: 作业1&#xff1a; 初始化数组 问题&#xff1a; 如果让数组初始化非0数会有问题 有同学就问了&#xff0c;我明明已经初始化定义过了&#xff0c;为啥还有0呀 其实这种初始化只会改变第一个…

蓝桥杯-网络安全比赛(7)基础知识 HTTP、TTL、IP数据包、MSS、MTU、ARP、LLMNR、MDNS、NBNS。

1. IP中TTL值能够给我提供什么信息&#xff1f;2. IP头部中标志、13位偏移、32位源IP地址、目标IP、IP数据包格式&#xff0c;有多少字节3. IP头部中的16位标识是什么&#xff1f;4. MSS 和MTU分别有多大&#xff1f;5. 怎么获取路由IP信息&#xff1f;PING、NSLOOKUP、TRACERT…

RAG进阶(二): RAG 融合(rag fusion)

在上一篇博客中&#xff0c;我们学习了多重查询(Multi Query)技术&#xff0c;Multi Query的基本思想是当用户输入查询语句(自然语言)时&#xff0c;我们让大模型(LLM)基于用户的问题再生成多个查询语句&#xff0c;这些生成的查询语句是对用户查询语句的补充&#xff0c;它们是…