Linux---(六)自动化构建工具 make/Makefile

news2024/11/16 9:45:10

在这里插入图片描述

文章目录

  • 一、make/Makefile
  • 二、快速查看
    • (1)建立Makefile文件
    • (2)编辑Makefile文件
    • (3)解释
    • (4)效果展示
  • 三、背后的基本知识、原理
    • (1)如何清理对应的临时文件呢?包括可执行。
    • (2)单独、反复make发现的现象
    • (3)为什么我们在编译的时候,make和Makefile总是不让重新编译我们的代码?
    • (4)make和Makefile是怎么做到识别新旧文件的?
    • (5)文件的ACM时间
      • 什么是ACM时间
      • 观察ACM时间的变化
      • 直接更新Modify时间,再make,什么现象?
    • (6)结论:
    • (7)make、Makefile是具有依赖性的推导能力的
  • 四、Makefile语法补充细节
    • (1)make时不回显命令的具体执行过程:
    • (2)Makefile中依赖方法有多个时,利用回车键
    • (3)Makefile中注释用#
    • (4)Makefile是支持变量替换的
    • (5)Makefile支持依赖关系的简写
    • (6)常规用法(期待我们写出的格式)


一、make/Makefile

make是一个命令。
Makefile是一个在当前目录下存在的一个具有特定格式的文本文件。
🎗️会不会写Makefile,从一个侧面说明了一个人是否具备完成大型工程的能力。
🎗️一个工程中的源文件数不胜数,其按照类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。
🎗️Makefile带来的好处就是自动化编译。一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
🎗️make是一个命令,是一个解释Makefile中指令的命令工具。一般来说,大多数的IDE都有这个命令,可见,Makefile都成为了一种在工程方面的编译方法。
🎗️make是一个命令,Makefile是一个文件,两个项目搭配使用,完成项目自动化构建。

二、快速查看

(1)建立Makefile文件

🎗️命令:

touch Makefile

(2)编辑Makefile文件

🎗️命令:

vim Makefile

在这里插入图片描述

(3)解释

在这里插入图片描述
在这里插入图片描述
🎗️make 会在当前的Makefile中扫描文件,找到源文件,执行目标文件形成时所对应的方法。
🎗️现实中,依赖关系+依赖方法=描述清楚一件事情的原因和做法,能达到我们的目标。

比如说,依赖关系是老爸,我是你儿子;依赖方法是给我打钱。

(4)效果展示

在这里插入图片描述

三、背后的基本知识、原理

(1)如何清理对应的临时文件呢?包括可执行。

🎗️代码

在这里插入图片描述

🎗️解读:
在这里插入图片描述

注意:
目标文件(包括伪目标)可以没有依赖关系。

🎗️清理项目的代码

make clean

在这里插入图片描述

(2)单独、反复make发现的现象

1.单独make默认从上到下扫描Makefile时,形成从上到下遇到的第一个伪目标文件。一般,清理工作写在最后。
2.不能对同一个文件重复make,因为Makefile默认在编译代码时能够自动识别出文件的新旧。
🎗️用PHONY修饰的目标文件,其实和正常的一般的文件无差别。
🎗️PHONY核心特点:总是被执行的

在一些特殊情况下,比如文件刚被编译过且没修改里面的内容,在make该文件时,第一次会被执行,后面再进行make就不执行该文件的依赖方法了。但是加上PHONY,它每make一次,就会被执行一次。

(3)为什么我们在编译的时候,make和Makefile总是不让重新编译我们的代码?

提高编译效率(如果有成千上万个文件中,里面只有几个文件被修改,那么重新编译这几个就可以了,没有更改的文件不需要编译)

(4)make和Makefile是怎么做到识别新旧文件的?

🎗️对比源文件的修改时间和可执行文件的修改时间

在这里插入图片描述

(5)文件的ACM时间

stat命令查看文件属性
用法:stat 文件名
在这里插入图片描述

什么是ACM时间

文件=内容+属性
文件的一切时间与内容、属性有关

🎗️Access时间:该文件的最近访问时间(例如:cat、vim、cd目录…)
🎗️Modify时间:对文件内容的最近修改时间
🎗️Change时间:对文件属性的最近修改时间

Change时间可能更改,就自己更改一下。
Modify时间可能更改,会和Change时间或者其他时间联动更改。

在这里插入图片描述

观察ACM时间的变化

🎗️Access的时间被更改为当前时间

在实际操作中,发现Change的时间也被更改,原因是Access时间也是文件的属性,发生变化时,Change时间也变化。

touch -a code.c

在这里插入图片描述

🎗️Modify时间被更改为当前时间

同时该操作也会伴随着Change时间变化

touch -m code.c

在这里插入图片描述

直接更新Modify时间,再make,什么现象?

直接更新Modify时间,是源文件的修改时间>可执行文件的修改时间,再make一下,就可被重新编译,形成一个新的可执行文件!

(6)结论:

🎗️1.通过时间对比,可以做到不让有些代码进行重编译
🎗️2.伪目标总是被执行的!他的依赖方法总是会被执行,不会被任何情况拦截。

(7)make、Makefile是具有依赖性的推导能力的

在这里插入图片描述

四、Makefile语法补充细节

(1)make时不回显命令的具体执行过程:

🎗️在Makefile文件中具体的操作命令前加@
在这里插入图片描述
在这里插入图片描述

(2)Makefile中依赖方法有多个时,利用回车键

(3)Makefile中注释用#

(4)Makefile是支持变量替换的

在这里插入图片描述
在这里插入图片描述

(5)Makefile支持依赖关系的简写

在这里插入图片描述
🎗️Makefile文件:
在这里插入图片描述

🎗️执行结果:

在这里插入图片描述

(6)常规用法(期待我们写出的格式)

在这里插入图片描述
在这里插入图片描述


以上内容就分享到这里啦!如果对友友们有帮助的话,记得点赞收藏博客,关注后续的内容创作哦
请添加图片描述

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

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

相关文章

SpringbootSecurity登陆验证(前后端分离)

一、什么是jwt JWT全称是JSON Web Token,如果从字面上理解感觉是基于JSON格式用于网络传输的令牌。实际上,JWT是一种紧凑的Claims声明格式,旨在用于空间受限的环境进行传输,常见的场景如HTTP授权请求头参数和URI查询参数。JWT会把…

基于若依的ruoyi-nbcio流程管理系统增加流程设计器支持自定义表单的选择与处理

更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 因为之前不支持在流程设计器进行自定义业务表单的关联选择,所以这部分实现这个。 1、前端 对…

使用jedis连接虚拟机redis报错 Failed to connect to any host resolved for DNS name

问题描述: 导致该问题发生的原因可能是虚拟机没有开放6379端口。 解决方案: 首先检查redis.conf的bing配置是否被注释了,如果没有将其注释 第二步,将保护模式设置为no 第三步,接下来可以使用命令查看6379端口是否…

聚观早报 |京东11.11公布成绩单;2023数字科技生态大会

【聚观365】11月13日消息 京东11.11公布成绩单 2023数字科技生态大会 TikTok深受英国中小企业青睐 周鸿祎称大模型2年内可“进”智能汽车 双11全国快递业务量达 6.39 亿件 京东11.11公布成绩单 京东11.11公布成绩单:截至11月11日晚23:59,2023年京东…

ASD光谱仪使用

ASD光谱仪使用 光谱仪机器和电脑用来实时查看光谱曲线,以及控制光谱仪采集的时间、条数等各项参数。 在采集时,需要面向太阳,将待测的对象完全暴露于阳光下(下图站位是错误的挡住光线了)。探头放置于对象正上方50cm处…

Linux进程之通过系统调用创建进程[fork()函数]

文章目录 0.PID是什么?1.通过代码创建子进程--fork1.1fork()初识1.2通过系统调用创建进程1.3perror()函数的了解 2.fork()的进一步了解2.1通过代码了解2.2查看进程的指令 0.PID是什么? 进程PID(Process ID)是操作系统为每个正在运行的进程分配的唯一标…

jquery的$

jQuery是什么 jQuery是一个快速、简洁的JavaScript框架,jQuery设计的宗旨是“write Less,Do More”。 jQuery的$ 使用过jQuery的应该都知道jQuery的$,看到源码中的这一段就能知道相当于jquery的简写, jquery有两种用法&#x…

Python 日志记录器logging 百科全书 之 日志回滚

Python 日志记录器logging 百科全书 之 日志回滚 前言 在之前的文章中,我们学习了关于Python日志记录的基础配置。 本文将深入探讨Python中的日志回滚机制,这是一种高效管理日志文件的方法,特别适用于长时间运行或高流量的应用。 知识点&…

【OS】操作系统课程笔记 第七章 内存管理

目录 7.1 内存管理的功能 7.1.1 内存分配 7.1.2 地址转换 1. 空间的概念 2. 地址转换 7.1.3 存储保护 7.1.4 存储共享 7.1.5 存储扩充 7.2 程序的链接和加载 7.2.1 程序的链接 链接的分类 7.2.2 程序的加载 1. 加载器的功能 2. 装入方式分类 7.3 连续分配方式 7.…

CentOS 7镜像下载;VMware安装CentOS 7;解决新安装的虚拟机没有网络,无法ping通网络的问题

CentOS 7镜像下载;VMware安装CentOS 8.5;解决新安装的虚拟机没有网络,无法ping通网络的问题 CentOS 8.5镜像下载VMware安装CentOS 7解决新安装的虚拟机没有网络,无法ping通网络的问题写入配置文件 CentOS 8.5镜像下载 阿里提供的…

排序 算法(第4版)

本博客参考算法(第4版):算法(第4版) - LeetBook - 力扣(LeetCode)全球极客挚爱的技术成长平台 本文用Java实现相关算法。 我们关注的主要对象是重新排列数组元素的算法,其中每个元素…

NSSCTF题库——web

[SWPUCTF 2021 新生赛]gift_F12 f12后ctrlf找到flag [SWPUCTF 2021 新生赛]jicao——json_decode() 加密后的格式 $json {"a":"php","b":"mysql","c":3}; json必须双引号传输 构造:GET里json{"x"…

【JUC】三、集合的线程安全

文章目录 1、ArrayList集合线程安全问题分析2、解决方式一:Vector或synchronizedList( )3、解决方式二:CopyOnWriteArrayList 写时复制4、HashSet集合线程不安全的分析与解决5、HashMap集合线程不安全的分析与解决 1、ArrayList集合线程安全问题分析 对…

TLP超线程技术

在实现IPL指令级并行的同时实现TLP(Thread Level Parallelism)线程级并行实现多线程有两种主要的方法超线程即同时多线程,在单个处理器或单个核中设置了两套线程状态部件,共享高速缓存和功能部件当两个线程同时需要某个资源时,其中一个线程必…

VuePress介绍及使用指南

VuePress是一个基于Vue.js的静态网站生成工具,它专注于以Markdown为中心的项目文档。VuePress具有简单易用的特性,同时提供了强大的自定义和扩展性。在本文中,我们将介绍VuePress的基本概念,并提供一个简单的使用指南。 什么是Vue…

【C语言】

C语言 1. C语言基础1.1 数据类型和占位符1.2 异或1.3 关键字1.4 const1.5 extern1.6 typedef1.7 static1.8 左值和右值1.9 位进行操作赋值 2. C指针3. 二维数组和指针4. 函数传递二维数组4.1 形参给出第二维的长度。4.2 形参声明为指向数组的指针。4.3 形参声明为指针的指针。 …

快速掌握队列的基础知识

目录 队列的特点基于链表实现队列用栈实现队列用队列实现栈 队列是一种线性数据结构,它只允许在一边进行插入操作(队尾),另一边进行删除操作(队头)。插入操作称为入队,删除操作称为出队。队列遵…

【网络奇缘】我和英特网再续前缘

🌈个人主页: Aileen_0v0🔥系列专栏: 一见倾心,再见倾城 --- 计算机网络~💫个人格言:"没有罗马,那就自己创造罗马~" 目录 计算机网络的概念 计算机网络的功能 ⭐1.数据通信 ⭐2.资源共享 ⭐3.分布式处理 ⭐4.提高可靠性 ⭐…

Java17新增特性

前言 前面的文章,我们对Java9、Java10、Java11、Java12 、Java13、Java14、Java15、Java16 的特性进行了介绍,对应的文章如下 Java9新增特性 Java10新增特性 Java11新增特性 Java12新增特性 Java13新增特性 Java14新增特性 Java15新增特性 Java16新增特…

Eclipse打包Springboot项目

首先&#xff0c;在pom.xml文件中添加配置&#xff0c;修改mainClass主函数&#xff1a; <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId><configurat…