浅讲make/makefile【linux】

news2024/11/29 12:53:52

浅讲make/makefile【linux】

  • 一. 什么是make/makefile?
  • 二. makefile
    • 2.1 依赖关系与依赖方法
    • 2.2 浅用make
        • 2.2.1 make test
        • 2.2.2 clean
    • 2.2 make一次执行多步
    • 2.3 部分修饰符号
      • 2.3.1 .PHONY(伪目标)
      • 2.3.2 @
      • 2.3.3 $@ $^

一. 什么是make/makefile?

make/makefile这两个可以说是搭档,缺一不可
make和makefile可以说是做大型项目不可缺少的功能
就本质来讲
make是系统自带的一条指令
makefile则是一个文件

使用make后:
编译器会自己去寻找目录下的makefile文件并执行

可以说make的指令作用:就是执行本目录下的makefile文件
当目录下没有makefile文件的时候就会报错
在这里插入图片描述

所以我们在学习make/makefile的功能,主要专注在makefile内部

二. makefile

想用make/makefile功能,直接自己在本目录下创建个makefile文件即可

touch makefile

在这里插入图片描述
用vim编辑器进行修改。
在这里插入图片描述
发现文件内是全空的,所以我们想要写出能用的makefile文件,需要先了解依赖关系与依赖方法

2.1 依赖关系与依赖方法

在这里插入图片描述
这里一条最普通的编译test的makefile指令

让我们看看这两行分别是什么

在这里插入图片描述
这里我们能看到一个指令的组成有两个部分

1.依赖关系
2.依赖方法

接下来我们分别来看一下这两个部分:

依赖关系:
在这里插入图片描述
左边可以说是指令名。
使用的时候就是
make test 来执行

test.cpp是test指令依赖的文件。

依赖方法
在这里插入图片描述
依赖方法可以说是
编程语言中函数体内的函数内容。
就是执行的指令

2.2 浅用make

了解了具体了以后我们就可以试着来编写两个makefile的文件了

2.2.1 make test

在这里插入图片描述
这个就是我们上面的例子,接下来我们来使用一下。
在这里插入图片描述
这里随便写了一个test.cpp的文件
在这里插入图片描述
这里输入

make test

可以发现这里已经执行了。
在这里插入图片描述
发现已经多了个可执行程序,makefile指令已经执行完毕了

2.2.2 clean

相同的,我们也可以写个像C++中的析构函数那样的清理可执行程序的clean指令

clean:
        rm -rf test

依赖关系冒号后面没有跟文件,代表这个指令没有依赖文件

这里来执行一下

make clean

在这里插入图片描述
发现test可执行程序被删除了

2.2 make一次执行多步

讲这个内容时会涉及到语言的执行过程,如果看不太懂,可以去翻我以前的博客
C语言程序的编译过程

在这里插入图片描述

这里的test.i ,test.s,test.o
都是之前程序编译和汇编以及链接的生成文件。

这里如果直接用make test.i会怎么样?
这不是很简单嘛
直接执行

g++ test.cpp -o test.i -E

就结束了。

但是如果我们执行 make test会怎么样?

在这里插入图片描述

我们会发现一下执行了全部的指令。

这里让我们来刨析一下过程。

在这里插入图片描述
第一步执行test时,发现依赖关系时test.o文件,但是系统查找不到
这是时候就会去寻找具有test.o的命令
在这里插入图片描述

这个时候找到 test.o指令,但是发现执行需要test.s,这个时候又会去寻找test.s文件

在这里插入图片描述

就这样不停寻找,找到了test.i能进行创建了
在这里插入图片描述

这个时候在返回到上一条需要test.i的指令,并执行
就这样一条一条执行并返回,就类似于递归一样的思路

那我们如果随便换个顺序也是结果会怎么样
在这里插入图片描述

在这里插入图片描述

发现结果不会变,因为顺序不会影响执行
系统是会寻找可以执行的指令,自动去执行,如果没有就报错
就C语言中的函数一样,引用函数不需要注重顺序,只要能被系统找到就可以了

2.3 部分修饰符号

接下来是几个比较基础的修饰符号

2.3.1 .PHONY(伪目标)

在执行makefile时,如果可执行文件已经产生,为了防止重复无意义的执行生成可执行文件指令
会自动判断可执行文件的源文件是否发生变动,从而判断是否要执行编译

例:在这里插入图片描述
这里进行了第一次编译。
在这里插入图片描述
第二次执行的时候就会发现,系统会阻止你重复make

那这么高大上的功能是怎么实现的呢?

其实就是通过对比时间而已

我们可以通过

stat 【文件名】

查看文件属性
在这里插入图片描述
access:访问时间
对文件内容进行修改:modify
对文件属性进行改变:change

这里要注意:对文件属性进行修改,文件内容的时间一般也会修改
因为文件内容有一个size的属性

按道理来说,对文件执行指令,access时间都要进行改变
但是因为access变化实在是太过于频繁,文件处于磁盘中,多个用户访问文件都要改变access,导致服务器十分卡顿
所以较新版中,只有对文件进行一定量的操作后才能会进行改变access时间

所以make文件对源文件进行依赖关系的操作的时候
会将可执行程序的时间转化为时间戳,将.cpp文件的修改时间转化为时间戳
进行比较,判断是否要执行指令

这里如果想要取消时间戳对比
就可以添加.PHONY修饰(伪目标)
但是不推荐将生成可执行文件用伪目标进行修饰
在这里插入图片描述
在这里插入图片描述
这里就可以随便进行执行了,不用进行时间戳的对比。

2.3.2 @

我们在输入了make后
make会自动弹出makefile中执行指令的依赖方法
在这里插入图片描述

在这里插入图片描述


加了@后,就可以防止弹出依赖方法

2.3.3 $@ $^

这两个修饰符主要用在依赖关系上

在这里插入图片描述
这两个分别代表了依赖关系的两边

那具体有什么用呢?

在这里插入图片描述
写依赖方法的时候就可以用符号代替文件名了

在这里插入图片描述
这里能发现文件正常执行了。

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

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

相关文章

uml知识点学习

https://zhuanlan.zhihu.com/p/659911315https://zhuanlan.zhihu.com/p/659911315软件工程分析设计图库目录 - 知乎一、结构化绘图1. 结构化——数据流图Chilan Yuk:1. 结构化——数据流图2. 结构化——数据字典Chilan Yuk:2. 结构化——数据字典3. 结构…

“理解梯度下降:直觉、数学公式和推导”

一、说明 梯度下降是机器学习中使用的一种流行的优化算法,通过迭代调整函数的参数来最小化函数。基本思想是将函数的参数沿函数梯度最陡峭下降的方向移动。 二、关于梯度的叙述 简单来说,想象一下你在山顶,你想尽快到达山脚下。你可以开始下坡…

流程图规范

文章目录 1.符号概览2.要求2.1 从上至下,从左至右的流向顺序2.2 开始符号只能有一个出口2.3 进程符号不做逻辑校验2.4 相同流程图,符号大小应为一致2.5 引用流程,而不是重复绘制2.6 路径符号应尽量避免相互交叉2.7 同一路径,箭头只…

【Python】Python语言基础(下)

目录 第十一章 控制结构 for语句 if语句 while语句 第十二章 函数 函数介绍 函数的定义 函数的调用 函数的传参 函数的传参方式 位置实参 关键字实参 默认值实参 函数的返回值 函数传递未知数量的实参 函数的模块调用 调用整个模块 调用模块中特定功能 第十…

业财融合潮流下,构建国有企业全面预算管理体系

近年来,在我国快速发展的变革过程中,国有企业改革的持续深入需要积极结合市场环境和自身发展需求,然而其传统的财务管理模式难以适应企业提出的新要求,预算管理与经营销售之间不断出现隔阂。为确保全面预算管理在国有企业内部的良…

部署个人静态网站到阿里云服务器(含域名解析)

使用前提: 您目前已经有一个静态网站,可以在本地通过html进行访问。 1、购买阿里云服务器 该步骤最详细的教程来自官方文档 具体到从注册开始每一个鼠标点击都有图片介绍。 你可以按照他的步骤完成整个部署过程,当然可以自己选择服务器的…

【实用调试技巧】总是找不到Bug?手把手教你在vs2022中调试程序

🦄个人主页:修修修也 🎏所属专栏:程序调试及报错解决 ⚙️操作环境:Visual Studio 2022 目录 什么是Bug? 1947年9月9日:第一个"Bug"被发现 什么是调试? 调试是什么? 调试的基本步骤 Debug和Relese的区别 1.调试的区别 2.文件大小的…

13 | 如何正确使用 @Entity 里面的回调方法

Java Persistence API 里面规定的回调方法有哪些? JPA 协议里面规定,可以通过一些注解,为其监听回调事件、指定回调方法。下面我整理了一个回调事件注解表,分别列举了 PrePersist、PostPersist、PreRemove、PostRemove、PreUpdat…

线性排序:如何根据年龄给100万用户数据排序?

文章来源于极客时间前google工程师−王争专栏。 桶排序、计数排序、基数排序时间复杂度是O(n),所以这类排序算法叫作线性排序。 线性的原因:三个算法是非基于比较的排序算法,都不涉及元素之间的比较操作。 三种排序对排序的数据要求苛刻&am…

19 | 如何搞清楚事务、连接池的关系?正确配置是怎样的

事务的基本原理 在学习 Spring 的事务之前,你首先要了解数据库的事务原理,我们以 MySQL 5.7 为例,讲解一下数据库事务的基础知识。 我们都知道 当 MySQL 使用 InnoDB 数据库引擎的时候,数据库是对事务有支持的。而事务最主要的作…

(转)富文本编辑器——Vue2Editor

介绍 Vue2Editor是一个简单易用且功能强大的Vue版本的富文本编辑器,其基于Quill.js和Vuejs构建! 简单易用、功能强大的富文本编辑器——Vue2Editor Github https://github.com/davidroyer/vue2-editor 特性 简单易用;基于Vue.js & Quil…

【Golang】Go的并发和并行性解释。谁说Go不是并行语言?

偶然发现百度上有很多"师出同门"的"go是并发语言,而不是并行语言"的说法。让我顿感奇怪,"并行"说白了就是对CPU多核的利用,这年头不能利用多核的编译语言还有的混?而且还混的这么好?并且…

Linux网络编程系列之服务器编程——非阻塞IO模型

Linux网络编程系列 (够吃,管饱) 1、Linux网络编程系列之网络编程基础 2、Linux网络编程系列之TCP协议编程 3、Linux网络编程系列之UDP协议编程 4、Linux网络编程系列之UDP广播 5、Linux网络编程系列之UDP组播 6、Linux网络编程系列之服务器编…

echarts关于一次性绘制多个饼图 (基于vue3)

在echarts中,dataset 和 source 是用来配置数据的选项。 dataset 是一个包含数据相关配置的对象,用于指定数据的来源和格式。它可以包含多个维度的数据集,每个维度都可以有自己的名称和数据。 source 是 dataset 中的一个子项,用于…

图计算(林子雨慕课课程)

文章目录 13. 图计算13.1 图计算简介13.2 Pregel简介13.3 Pregel图计算模型13.3.1 有向图和顶点13.3.2 Pregel的计算过程13.3.2 Pregel实例 13.4 Pregel的C API13.4.1 定义Vertex基类13.4.2 消息传递机制和Combiner13.4.3 Aggregator、拓扑改变和输入输出 13.5 Pregel的体系结构…

【通过实验带你认识linux下的源码编译】

通过实验带你认识linux下的源码编译 01 初识项目编译02 编译过程03 完整的编译过程1、创建源代码文件2、创建configure脚本3、创建Makefile.am 源代码是相对目标代码和可执行代码而言的。源代码是用汇编语言和高级语言写出来的代码。 目标代码是指源代码经过编译程序产生的能被…

qml介绍

文章目录 qml简介对象一个风车的例子 qml简介 从 Qt 4.7 开始,Qt 引入了一种声明式脚本语言,称为 QML(Qt Meta Language 或者 Qt Modeling Language),作为 C 语言的一种替代。而 Qt Quick 就是使用 QML 构建的一套类库…

(latex中appendix附录怎么写)以及(附录里面的图片表格之类的如何重新编号)

文章目录 初级:怎么写进阶:怎么重新编号进阶:怎么换成单栏格式 初级:怎么写 这个很简单,我一开始以为很复杂。 \begin{document} #这里是“正文”。 #这里是“引用”。 #下面开始是附录。 \appendix \section{Proofs…

英语——分享篇——每日100词——801-900

medical——adj.医疗的——me我(熟词)di弟(拼音)cal擦了(拼音) chief——n.酋长——thief小偷——小偷拜见酋长 pork——n.猪肉——p皮鞋(编码)or偶人(拼音)k机关枪(编码)——穿着皮鞋的偶人扛着机关枪挑猪肉 pie——n.馅饼,派——瞥——他无意瞥见一块馅饼 saus…

GB28181平台简介

产品简介 LiveMedia视频中间件是支持部署到本地服务器或者云服务器的纯软件服务,也提供服务器、GPU一体机全包服务,提供视频设备管理、无插件、跨平台的实时视频、历史回放、语音对讲、设备控制等基础功能,支持视频协议有海康、大华私有协议…