【Linux】Linux项目自动化构建工具 --- make / makefile

news2024/11/26 18:28:09

在这里插入图片描述

👦个人主页:Weraphael
✍🏻作者简介:目前正在学习c++Linux还有算法
✈️专栏:Linux
🐋 希望大家多多支持,咱一起进步!😁
如果文章有啥瑕疵,希望大佬指点一二
如果文章对你有帮助的话
欢迎 评论💬 点赞👍🏻 收藏 📂 加关注😍


目录

  • 一、为什么要使用make
  • 二、makefile的基本语法
      • 2.1 基本语法
      • 2.2 清理项目文件
      • 2.3 执行顺序问题
      • 2.4 连续make问题
      • 2.5 makefile中的特殊符号

一、为什么要使用make

先来想象一个案例,假设一个执行文件里面包含了5个源代码文件,分别是main.cadd.csub.cdiv.cmul.c,这5个文件的目的是:

  • main.c:让用户输入两个操作数和一个操作符,再调用其他4个子程序。

在这里插入图片描述

  • Add.c:计算两数之和。

在这里插入图片描述

  • Sub.c:计算两数之差。

在这里插入图片描述

  • Div.c:计算两数之商。

在这里插入图片描述

  • Mul.c:计算两数之积。

在这里插入图片描述

接下来让以上使用gcc编译代码,让程序运行起来

在这里插入图片描述

我们发现一个特点:gcc同时编译多个源文件的时候写的很长

而且如果某个模块修改了,还得要重新编译,光是找出这个命令就够烦人的了。

如果可以的话,能不能有一个步骤完成上面的所有操作?

那就利用 make指令和makefile文件

首先先带大家见见猪跑,后面再教大家怎么写。

在这里插入图片描述
通过以上样例,我们发现仅仅通过make指令就生成了可执行文件,真的非常方便。

另外,如果我们修改某些源代码文件,则make也可以更新该执行文件test.exe,如此一来,节省了很多编译的时间。

在这里插入图片描述

要知道,某些程序在进行编译的操作时,会消耗很多CPU资源。所以说make有以下这些好处:

  • 简化编译时所需要执行的命令

  • 如果修改了某个源文件,则make仅会针对被修改的文件进行重新编译来更新执行文件。

make里面最需要注意的大概就是文件makefile,所以接下来我们就针对makefile的语法来加以介绍。

二、makefile的基本语法

2.1 基本语法

makefile 文件中主要编写任务,而任务由 依赖关系 + 依赖方法 构成注意:Makefile文件开头也可以大写。

因此,基本的makefiile语法是这样的:

执行文件 : 源文件1 源文件2 ...            # 依赖关系
<tab> gcc 源文件1 源文件2 ... -o 执行文件 # 依赖方法

# 在makefile中,#代表注释
# 依赖方法必须以<tab>键为开头
# 执行文件与依赖文件(源文件)之间需要以[:]隔开

接下来我用gcc编译代码的过程再写一套:

在这里插入图片描述

以上是Makefile文件和源文件的内容,接下来执行make指令

在这里插入图片描述

接下来分析这些依赖关系

在这里插入图片描述

2.2 清理项目文件

大家有没有发现,make一下发现文件变多了,那能不能也通过执行一个命令就直接删除所有的目标文件和执行文件呢?答案是当然可以!

clean :  # 不需要依赖任何文件
	rm -rf [要删除的文件]

在这里插入图片描述

2.3 执行顺序问题

单纯输入make指令时,默认执行makefile中的第一个任务,当任务成功执行后,不再继续执行后续任务。

在这里插入图片描述

当然我们可以指定执行任务make filename。就像上面的clean一样。

在这里插入图片描述

2.4 连续make问题

我们在开始就发现,当我们连续的make的时候,会提示我们文件已经是最新的

在这里插入图片描述

  • 这是为什么呢?

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

  • 那是如何做到的呢?

首先大家得明白一个概念,可执行文件的时间不可能会等于源文件的时间。因为必须要先有源文件才能够有可执行文件。因此,源文件的创建时间要早于可执行文件的创建时间

那么,其实系统只需要对比源文件最近修改时间和可执行文件的时间,就可以判定是否重新编译。

  • 如果源文件的时间晚于可执行文件的时间。说明源文件被修改过了,因此就需要重新编译

  • 如果源文件的时间早于可执行文件的时间。说明源文件没被修改过了,因此就不需要重新编译

因此,这里有一条指令能帮助我们查看文件的时间

stat [filename]

在这里插入图片描述

那么有没有什么办法可以重复执行呢?答案当然是有的!

.PHONYmakefile 文件中的一个关键字,意为对某某对象生成伪目标,这样就能在不对源文件进行修改的情况下,重复执行任务了。

# 在makefile开头写上
.PHONY : [你需要重复执行的任务]

在这里插入图片描述

然后我们再重复执行make指令看看效果

在这里插入图片描述

但是需要注意的是:以上对源文件的做法是没有意义的。一直重复执行没有修改的源文件不是白费力气吗?

.PHONY 这个关键字,一般是用来修饰 clean 任务,即清理解决方案

在这里插入图片描述

2.5 makefile中的特殊符号

makefile中有两个特殊符号

$@ - 冒号左边的文件
$^ - 冒号右边的文件

在这里插入图片描述

再来看看效果

在这里插入图片描述

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

在这里插入图片描述

再来看看效果

在这里插入图片描述

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

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

相关文章

tidyverse数据特征学习

目录 特征缩放 1&#xff0c;标准化-scale 2&#xff0c;归一化-rescale 3&#xff0c;行规范化 4&#xff0c;数据平滑 特征变换 1. 非线性特征 2. 正态性变换 3. 连续变量离散 特征降维 特征缩放 不同数值型特征的数据量纲可能相差多个数量级&#xff0c;这对很多…

ZGC 垃圾回收过程

ZGC&#xff08;Z Garbage Collector&#xff09;是Java平台上的一种垃圾收集器&#xff0c;它是由Oracle开发的&#xff0c;旨在解决大堆的低延迟垃圾收集问题。ZGC是一种并发的分代垃圾收集器&#xff0c;它主要针对具有大内存需求和低停顿时间要求的应用程序 ZGC的核心概念及…

人力资源管理后台 === 首页+部署

目录 1.首页-echarts图表的应用 2.首页-echarts图表的按需导入 3.路由模式-将路由改成history模式 4. 打包分析-分析 5.CDN加速 6.项目打包-安装nginx 7.mac/windows环境下nginx部署启动项目 8.nginx解决history的404问题 9.nginx配置代理解决生产环境跨域问题 1.首页-…

复数的几何意义

1、复平面&#xff0c;复数的其它表示法 (1)几何表示法 直角平面坐标&#xff1a; 复平面 实轴&#xff0c;虚轴 (2)向量表示法 向量 模&#xff1a; 复数加减法可用向量的三角形法则或者平行四边形法则 (3)结论 (两边之和大于第三边) ((两边之差大于第三边)) *辐角&am…

「Verilog学习笔记」非整数倍数据位宽转换24to128

专栏前言 本专栏的内容主要是记录本人学习Verilog过程中的一些知识点&#xff0c;刷题网站用的是牛客网 要实现24bit数据至128bit数据的位宽转换&#xff0c;必须要用寄存器将先到达的数据进行缓存。24bit数据至128bit数据&#xff0c;相当于5个输入数据第6个输入数据的拼接成一…

Educational Codeforces Round 158 [Rated for Div. 2]

A. Line Trip 还算比较简单的&#xff0c;不过本蒟蒻一开始以为是二分答案&#xff0c;二分写到一半突然想到油量直接取两个加油站之间的最大距离就好了。 最大距离能过&#xff0c;剩下必然都能过&#xff0c;要特判a[n]~x距离是两倍&#xff0c;因为x没有加油站&#xff0c…

【Python百宝箱】Python项目生态圈:虚拟环境全指南

项目管理达人&#xff1a;Python虚拟环境的智慧选择 前言 在Python开发领域&#xff0c;创建虚拟环境是一项至关重要的任务&#xff0c;它有助于项目之间的依赖隔离&#xff0c;确保每个项目都能独立运行且使用特定的库和工具。本文将介绍多种创建Python虚拟环境的方法&#…

C语言线性表的实现(详解)

数据结构之线性表 ​ 线性表的基本概念&#xff1a;线性表是由0个或者多个数据元素的有限序列 ​ 特性是&#xff1a; ​ 1&#xff1a;数据元素之间都是有顺序的 ​ 2&#xff1a;数据元素的个数是有限的&#xff0c; ​ 3&#xff1a;数据元素的类型是相同的 ​ 性质是&…

二进制编辑器hexedit的安装及使用

Hexedit 同时以 ASCII 和十六进制显示文件 安装 终端输入hexedit回车&#xff0c;如果没安装&#xff0c;会提示让输入 sudo apt-get install hexedit 照着输入命令&#xff0c;安装。安装完成后&#xff0c;cd到一个有二进制文件的目录下&#xff0c;输入hexedit命令回车 再…

激光雷达SLAM(一)------初始激光雷达SLAM

专栏目的及认识激光雷达SLAM 一、专栏目的二、初始激光雷达SLAM1、激光雷达SLAM算法相关知识点2、SLAM常见问题[^2]3、激光雷达SLAM的需求点4、RTK在SLAM中的作用5、激光雷达视觉紧耦合图优化滤波紧耦合 一、专栏目的 大家好&#xff01;介绍一下博主自己&#xff0c;感知算法工…

在云服务器上搭建个人版chatGPT及后端Spring Boot集成chat GPT

原创/朱季谦 本文分成两部分&#xff0c;包括【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】。 无论是在【国内服务器上搭建chat GPT】和【后端Spring Boot集成chat GPT】&#xff0c;两个方式都需要魔法访问&#xff0c;否则是无法正常使用的&#xff0c;即…

Java Flight Record 详解

核心概念 Java Flight Record 提供一个低开销的数据收集框架&#xff0c;用于对 Java 应用程序和 HotSpot JVM 进行故障排除。Flight Recorder 记录源自应用程序、JVM和操作系统的事件 Flight Record&#xff0c;顾名思义&#xff0c;相当于飞机黑匣子里保存的飞行记录 事件 …

vue3+ts mitt的使用

安装mitt :npm i mitt -Smain.ts: import mitt from mittconst Mit mitt();declare module vue {export interface ComponentCustomProperties{$Bus:typeof Mit} } app.config.globalProperties.$BusMit在A组件中使用 <template><div><h1>我是A<…

Leetcode—160.相交链表【简单】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—160.相交链表 算法思想 两个链表的节点之和是相等的 如果两个链表相交&#xff0c;那么相交点之后的长度是相同的 我们需要做的事情是&#xff0c;让两个链表从同距离末尾同等距离的位置开始遍历。这个位置只能是较短…

【高可用架构】Haproxy 和 Keepalived 的区别

Haproxy 和 Keepalived 的区别 1.负载均衡器介绍2.Haproxy 和 Keepalived 的基本概念和特点2.1 Haproxy2.2 Keepalived 3.Haproxy 和 Keepalived 的区别3.1 功能上的区别3.2 架构上的区别3.3 配置上的区别 4.总结 1.负载均衡器介绍 负载均衡器是一种解决高并发和高可用的常用的…

【JavaSE】:数据类型

数据类型 一.总体概论二.java里与c的区别1.float2.char3.boolen 三.类型转换四.String类型 一.总体概论 在Java中数据类型主要分为两类&#xff1a;基本数据类型和引用数据类型。 不论是在16位系统还是32位系统&#xff0c;int都占用4个字节&#xff0c;long都占8个字节 。 整…

NAS非接入层协议学习(二)

在无线通信网络中 NAS (Non-Access Stratum)做为非接入层是演进分组系统(或5G核心网)中的一组协议。NAS用于在用户设备(UE)和移动管理实体(MME/AMF)之间传送非无线电信令&#xff0c;以实现NR/LTE/E-UTRAN接入。 NAS在协议栈中是控制面的最高层。 NAS协议分组中可以将其分为两…

3款免费的语音视频转文本AI神器

最近有很多粉丝让我出一期关于语音转文本的免费AI神器&#xff0c;毕竟这类工具在学习和工作中经常会用到&#xff0c;那今天就给大家安排。 我亲测了好几款软件之后&#xff0c;最终评选留下了三款 剪映hugging face飞书妙记 接下来一一给大家讲解 1.剪映 剪映其实是一款视…

因式分解的几何意义

本来准备和女儿一起玩一道几何题&#xff0c;想想还是算了&#xff0c;不如讲点更有趣的。 任何因式分解都是在堆积木&#xff0c;不信你看&#xff1a; 二项式定理&#xff0c;洋灰三角&#xff0c;都是面积&#xff0c;体积&#xff0c;超维体积的拼接&#xff0c;一个大超…

Python | CAP - 累积精度曲线分析案例

CAP通常被称为“累积精度曲线”&#xff0c;用于分类模型的性能评估。它有助于我们理解和总结分类模型的鲁棒性。为了直观地显示这一点&#xff0c;我们在图中绘制了三条不同的曲线&#xff1a; 一个随机的曲线&#xff08;random&#xff09;通过使用随机森林分类器获得的曲线…