【Linux】第九站:make和makefile

文章目录

  • 一、 Linux项目自动化构建工具make/Makefile
    • 1.make/makefile工作现象
    • 2.依赖关系与依赖方法
    • 3.如何清理
    • 4.为什么这里我们需要带上clean
    • 5.连续的make
    • 6.特殊符号
  • 二、Linux下实现一个简单的进度条
    • 1.回车换行
    • 2.缓冲区
    • 3.倒计时的实现

一、 Linux项目自动化构建工具make/Makefile

1.make/makefile工作现象

make/makefile

make是一条指令

makefile是一个当前目录下的文件

他们的用法如下

这样的话,当我们直接输入make的时候自动执行下面的这条语句

image-20231101175024811

image-20231101175008183

如果我们还想要清理的话,我们可以这样做

image-20231101175503976

这样的话,就可以将我们从繁杂的命令中解脱了

image-20231101175617536

在上面的makefile文件中,我们也可以是Makefile文件。

test.exe依赖于test.c

而下面的方法就是依赖方法

下面的clean不依赖于任何方法

2.依赖关系与依赖方法

什么是依赖关系和依赖方法呢?

在下面的例子中

image-20231101183342324

test依赖于test.c生成,下面的一行就是依赖的方法,即生成的具体细节

我们可以将其具体的写的详细一些

如下所示

image-20231101185156258

当我们make的时候

image-20231101185135163

它的执行逻辑是这样的,先去执行第一个依赖关系,但是第一个依赖关系所需要的被依赖的文件不存在,我们继续去找看这个被依赖的文件能否被生成,如此递归下去。最终我们在被依赖的位test.c的时候刚好找到了,停了下来,然后开始不断的往回执行

所以就有了上面的效果

而且即便我们将Makefile里面的内容给乱序了,它依然按照它的标准去找

不影响最终结果

image-20231101194056330

image-20231101194115268

这个过程其实就是makefile的自动化推导

如果我们缺少了其中的一个依赖关系,那么则会直接报错

image-20231101194535868

image-20231101194518331

3.如何清理

上面的依赖关系可以使得我们减少繁琐的命令。仅需一个make即可

那么清理其实也是比较麻烦的一件事情,我们能否去完成呢?当然是可以的

image-20231101195706662

如下就完成了清理工作

image-20231101195729147

这个clean是不需要依赖关系,只需要一个方法即可

4.为什么这里我们需要带上clean

现在的问题是为什么我们执行清理的时候要带上clean呢?而前面那个不需要呢?

其实这个make是默认执行第一个依赖的。而前面连续调用多个依赖是因为要像栈一样的链式调用

我们也可以自己手动去调用它这个第一个依赖

image-20231101200219349

如果我们将clean改为了第一个依赖,那么就会默认执行clean

image-20231101200328971

不过我们还是建议将生成可执行程序的那个依赖放在第一个

5.连续的make

我们现在将我们的makefile文件变为下面的样子

image-20231101200842900

然后当我们连续的make的时候,会显示如下

image-20231101200906461

  • 这是为什么呢?

这其实是因为我们的make编译完成之后,如果源代码没有被改变过,那么就不会再次编译了,因为根本没有必要

这里的目的就是为了提高编译效率

  • 那么这里是怎么做到呢?

这里一定是源文件形成可执行,先有源文件,才有可执行,一般而言,源文件的最近修改时间比可执行文件要老的

而如果我们更改了源文件,历史上曾经还有可执行,那么源文件的最近修改时间,一定要比可执行程序要新

所以只需要比较,可执行程序的最近修改时间和源文件的最近修改时间,如果.exe新于.c源文件,不需要重新编译;.exe老于.c源文件,需要重新编译

一般而言,.exe == .c的时间是不可能的。

那么如何证明前面所说的

在linux中有一条命令stat

它可以访问文件的一些时间

image-20231101202513095

这里有三个时间

Access : 最近访问时间

比如cat,vim都会去访问。这些都会更改这个时间

Modify : 最近的对文件内容修改的时间

文件 = 文件内容 + 文件属性

change : 最近修改文件属性时间

这三个时间我们也称为ACM时间

这三个时间很有可能是同时修改的

比如当对文件内容修改后,由于访问了,所以Access时间也被修改了,而内容修改必然伴随着文件大小的改变,所以最终文件属性也要被修改,所以最终三个时间都被修改了

比如下面,我们进去修改了一下,就会导致全部时间被修改了

image-20231101204116578

如下是我们修改文件的属性

image-20231101204402762

上面的一切都符合我们的预期

不过在有的linux系统上,我们的access时间不会被修改。

这是因为Access时间更新太频繁了。需要写到磁盘上,由于频繁的访问外设会使得效率大大降低。所以现在的一些linux系统会根据modify和change的修改次数去进行修改,以此减少开销。可以理解为里面有一个计数器的存在,变相的提高效率

如果我们就想要修改,那么我们可以使用touch,touch后面如果跟的是一个不存在的文件名,就会创建一个文件,如果是已经存在的,会将该文件的所有时间全部更新

image-20231101204956789

我们也可以定向的只改变一部分的

这里因为时间也是文件的属性,所以Access会改变后,change也会改变

image-20231101205056401

image-20231101205231402

所以现在我们知道了如何访问时间

不过问题还是之前的要比较两个的时间,他们其实比较的就是Modify时间,即文件内容的最近修改时间

将这些时间转化为时间戳,然后比较时间戳的大小即可

我们可以看到,明显.c文件要老于.exe文件,所以无法再次编译

image-20231101205749988

如果我们使用touch命令强行修改test.c的时间,那么就可以再次编译了

image-20231101210519400

所以上面的过程已经足以证明

make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译

所以make命令并不总是执行编译的!

但是如果我们非要它每次都想要执行,不要管什么时间了,我们可以在makefile文件加上这句话

image-20231101210953733

代表对于test这个依赖也不要管什么时间的问题了,每次都要执行

这个.PHNOY就是伪目标修饰

image-20231101211104286

不过我们这个一般不建议放在编译时候,而是在清理的时候去修饰

image-20231101211257633

修饰以后,这个clean就变成了伪目标,代表每次都执行

image-20231101211348868

6.特殊符号

在makefile中有两个特殊符号

image-20231101211539492

$@指的是冒号左边的那部分

$^指的是冒号右边的那部分

所以我们的这个编译可以改为上面的写法了

image-20231101211708713

不过我们也会发现我们上面的使用make的操作会使得这些命令回显出来,如果我们不想要回显出来,我们可以加上@

image-20231101211836790

image-20231101211904789

二、Linux下实现一个简单的进度条

1.回车换行

回车和换行其实是两个概念

比如说在我们写作文的时候

当我们将一行写完了,如果我们是从第二行的开头写起,这其实叫做回车换行。

如果我们是直接这一行的正下方写起来,这就是换行

所以回车换行是两个动作

即将光标挪到下方是换行,将光标挪到开头这是回车

只不过我们c语言的\n一个就直接代表了回车换行,如果我们拆开用的话,就有他们各自的含义了,这也解释了为什么我们显示器在打印的时候,命名是换行但是确实在新一行的最开头了

即如果我们只想回车的话,那就是\r,如果是回车换行就是\n

2.缓冲区

我们先看如下代码

image-20231101215016832

注意,sleep这个函数的头文件是unistd.h,这个可以在man手册中查找到

这是我们的运行结果,具体的现象是这样的,先打印出hello world,然后停顿两秒钟,然后再显示我们下面的命令行

image-20231101215125241

如果我们将这个代码改为这样子

image-20231101215319456

那么会先执行1还是2呢?

首先肯定是先执行1,因为这是c语言的特性,顺序执行

但是下面是我们的现象,这个现象是先停顿两秒钟,然后hello world和命令行同时出现

image-20231101215503341

那么这是为什么呢?

在我们sleep期间,“hello world”在哪里呢?它一定是被保存起来了

这里其实保存在了缓冲区

这个缓冲区就是由C语言维护的一段内存

这里其实就是因为没有刷因缓冲区才导致的

在C语言中会默认打开标准输入、标准输出(显示器、stdout)、标准错误,三个流

如果我们想要刷新缓冲区,那么就可以刷新输出流即可

下面这个函数可以刷新

image-20231101220310799

所以我们可以将代码改成这样

image-20231101220448713

这样的话,hello world就会立刻出来,然后个等待两秒后,显示命令行

image-20231101220544884

3.倒计时的实现

如果我们的代码是这样的,那么最终的效果是,一次性将987654321全部输出,这是因为,没有刷新缓冲区

image-20231101220948370

image-20231101221013990

但是我们显然不可以直接加上\n,因为这样虽然会刷新缓冲区,但是也换行了。没有倒计时是会换行的

如果我们的代码是这样的

image-20231101221224212

那么最终的效果是这样的,我们也知道这样也是不行的,因为倒计时应该是覆盖原来的位置的

image-20231101221208311

所以我们应该将倒计时写成这样的

这个\r代表回车,即将光标移动到当前行的最开头。而我们加上%-2d的原因是因为10是一个两位数。如果不这样做就会出现10,90,80,70…这种数据,因为它只会覆盖一个数据,我们显示屏打印的只是一个字符一个字符的打印的。10是俩个字符,我们后面只能覆盖一个字符

image-20231101221600738

image-20231101221733244

所以最终,达到了我们的预期了

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

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

相关文章

Mybatis—XML配置文件、动态SQL

学习完Mybatis的基本操作之后&#xff0c;继续学习Mybatis—XML配置文件、动态SQL。 目录 Mybatis的XML配置文件XML配置文件规范XML配置文件实现MybatisX的使用 Mybatis动态SQL动态SQL-if条件查询 \<if\>与\<where\>更新员工 \<set\>小结 动态SQL-\<forea…

RHCSA -- VMware虚拟机配置及破解密码

一、配置虚拟机 1、开启VMware&#xff08;自定义&#xff09; 2、设置虚拟机硬件兼容性&#xff08;默认&#xff09; 3、稍后安装虚拟机操作系统 4、选择为Linux的虚拟机 5、虚拟机机名 6、设置虚拟机处理器 7、设置虚拟机所连接的网络类型 8、选择磁盘类型 9、设置所选磁…

Linux--jdk,tomca,mysql安装、后端项目搭建

一、JDK和Tomcat的安装 1.JDK安装 直接上传到Linux服务器的&#xff0c;上传jdk、tomcat安装包 解压JDK安装包 //解压jdk tar -zxvf jdk-8u151-linux-x64.tar.gz 置环境变量(JAVA_HOME和PATH) vim /etc/profile 在文件末尾添加以下内容&#xff1a; //java environment expo…

【算法|滑动窗口No.4】leetcode 485.最大连续 1 的个数 487.最大连续 1 的个数 II 1004. 最大连续1的个数 III

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【手撕算法系列专栏】【LeetCode】 &#x1f354;本专栏旨在提高自己算法能力的同时&#xff0c;记录一下自己的学习过程&#xff0c;希望…

APISpace 天气预报查询API接口案例代码

1.天气预报查询API产品介绍 APISpace 的 天气预报查询&#xff0c;支持全国以及全球多个城市的天气查询&#xff0c;包含国内3400个城市以及国际4万个城市的实况数据&#xff0c;同时也支持全球任意经纬度查询&#xff0c;接口会返回该经纬度最近的站点信息&#xff1b;更新频率…

英语语法,时态总结,16种时态

文章目录 前言总体说明过去时一般过去时过去进行时过去完成时过去完成进行时 现在时一般现在时现在进行时现在完成时现在完成进行时 将来时一般将来时将来进行时将来完成时将来完成进行时 过去将来时一般过去将来时过去将来进行时过去将来完成时过去将来完成进行时 前言 学了这…

ChatGPT火了:还有哪些可以做的变现项目

一、写在前面 柴特鸡皮踢 大家都不陌生了 说实话&#xff0c;Chatgpt火了后&#xff0c;正经的项目没出来多少&#xff0c;出了一大批割九菜的。 为什么说是割韭菜&#xff0c;因为一群完全不懂技术&#xff0c;只会讲讲成功学、写作学、财经的大V也敢开社群、卖课。很多人听…

Linux的开发环境安装配置与后端项目部署

目录 一.安装开发环境 1.准备阶段 1.1 创建新目录 1.2 解压文件 2.JDK的安装与配置环境变量 2.1 解压jdk压缩包 2.2 配置环境变量 2.3 设置环境变量生效 2.4 验证是否安装成功 3.Tomcat的安装与使用 3.1 解压安装 3.2 开启服务 3.3 开放端口 3.4 访问成功 4.MySQ…

【嵌入式】HC32F07X CAN通讯配置和使用配置不同缓冲器以连续发送

一 背景说明 使用小华&#xff08;华大&#xff09;的MCU HC32F07X实现 CAN 通讯配置和使用 二 原理分析 【1】CAN原理说明&#xff08;参考文章《CAN通信详解》&#xff09;&#xff1a; CAN是控制器局域网络(Controller Area Network, CAN)的简称&#xff0c;是一种能够实现…

实在智能携手品牌商家,在活动会面中共谋发展

金秋十月&#xff0c;丰收的季节&#xff0c;也是商家们在双11大展拳脚的时刻。为迎战一年一度的双11大促&#xff0c;品牌商家在10月份卯足劲&#xff0c;制定一系列营销方案&#xff0c;争取为店铺带来更多流量和订单。 其中&#xff0c;舍得、同科医药、梅子熟了、宝洁、维…

海上风电应急救援vr模拟安全培训提高企业风险防范能力

相比传统的发电厂&#xff0c;海上风电作业积累的经验少&#xff0c;风险高&#xff0c;因此为了规范施工人员的行为和操作&#xff0c;保障生产安全进行&#xff0c;开展海上风电VR安全培训具有重要意义。 有助于提高员工的安全意识 通过模拟真实的海上风电作业环境&#xff0…

基于元学习神经网络的类人系统泛化

Nature 上介绍了一个关于AI在语言泛化方面的突破性研究。科学家们创建了一个具有人类般泛化能力的AI神经网络&#xff0c;它可以像人类一样将新学到的词汇融入现有词汇&#xff0c;并在新环境中使用它们。与ChatGPT 相比&#xff0c;该神经网络在系统性泛化测试中表现得更好。 …

AMD Ryzen AI 暂仅支持 Windows,Linux 系统有望后续支持

近日消息&#xff0c;最新的 AMD Ryzen 7040 系列笔记本电脑配备了基于 Xilinx IP 的专用 AI 引擎&#xff0c;名为“Ryzen AI”&#xff0c;可以加速 PyTorch 和 TensorFlow 等机器学习框架的运行。不过目前这个 Ryzen AI 只支持微软 Windows 系统。但是如果有足够的客户需求&…

NLP实践——中文指代消解方案

NLP实践——中文指代消解方案 1. 参考项目2. 数据2.1 生成conll格式2.2 生成jsonline格式 3. 训练3.1 实例化模型3.2 读取数据3.3 评估方法3.4 训练方法 4. 推理5. 总结 1. 参考项目 关于指代消解任务&#xff0c;有很多开源的项目和工具可以借鉴&#xff0c;比如spacy的基础模…

恒驰服务 | 华为云数据使能专家服务offering之数仓建设

恒驰大数据服务主要针对客户在进行智能数据迁移的过程中&#xff0c;存在业务停机、数据丢失、迁移周期紧张、运维成本高等问题&#xff0c;通过为客户提供迁移调研、方案设计、迁移实施、迁移验收等服务内容&#xff0c;支撑客户实现快速稳定上云&#xff0c;有效降低时间成本…

【Elasticsearch 未授权访问漏洞复现】

文章目录 一、漏洞描述二、漏洞复现三、修复建议 一、漏洞描述 ElasticSearch是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;并作为Apache许可条款下的开放源码发布&am…

应用在阀门控制中的直流有刷驱动芯片

控制阀又称阀门&#xff0c;是流体运送系统中的控制部件&#xff0c;具有导流、截流、调节、节流、防止倒流、分流或溢流卸压等功能。阀门是一种用于控制流体&#xff08;液体、气体、粉体等&#xff09;流动的装置&#xff0c;广泛应用于工业生产、建筑、农业、能源等领域。 …

图像二值化阈值调整——cv2.threshold方法

二值化阈值调整&#xff1a;调整是指在进行图像二值化处理时&#xff0c;调整阈值的过程。阈值决定了将图像中的像素分为黑色和白色的界限&#xff0c;大于阈值的像素被设置为白色&#xff0c;小于等于阈值的像素被设置为黑色。 方法一&#xff1a; 取阈值为 127&#xff0c;…

京东科技埋点数据治理和平台建设实践 | 京东云技术团队

导读 本文核心内容聚焦为什么要埋点治理、埋点治理的方法论和实践、奇点一站式埋点管理平台的建设和创新功能。读者可以从全局角度深入了解埋点、埋点治理的整体思路和实践方法&#xff0c;落地的埋点工具和创新功能都有较高的实用参考价值。遵循埋点治理的方法论&#xff0c;…

Mac终端学习

命令1&#xff1a;ifconfig 作用&#xff1a;列出本机所有的网络设备以及其上面的配置&#xff0c;主要指的是ip地址和mac地址 其他用法&#xff1a;sudo ifconfig en4 add 10.10.10.12 netmask 255.255.255.0 作用&#xff1a;给en4加入别的网段 其他用法&#xff1a;sudo i…