【Linux】Linux项目自动化构建工具—make/Makefile

news2024/11/25 2:30:13

目录

  • 一.什么是make/Makefile
    • Makefile
    • make
  • 二.Makefile逻辑
    • 1.简单依赖
    • 2.复杂依赖
  • 三.make指令
    • 1.make的使用
    • 2.clean清理
    • 3.伪目标
    • 4.make如何确定是否编译
      • 访问时间的影响
      • 修改时间的影响

一.什么是make/Makefile

Makefile

在Windows下,我们使用VS、VS Code这些ide编写C/C++程序去实现一个工程后,这些ide就会帮我们处理处理生成这些程序的可执行文件。

而在Linux下如果我们需要自己去通过指令来实现这个工程,一个工程中的源文件不计数,其按照类型、功能、模块分别放在若干个目录中,如果去一一连接实现这是十分不方便的。

而Linux提供了项目自动化编译工具——Makefile,其定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译,那些文件需要重新编译,甚至于进行更复杂的功能操作。Makefile一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

所以,会不会写Makefile,从侧面说明了一个人是否具备完成大型工程的能力。

make

make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。

如下:我们利用Makefile生成C语言文件hello.c的可执行文件
在这里插入图片描述
当一个c程序员所处的开发环境只有一个通过终端连接的Linux时,Makefile几乎时构建复杂工程的唯一选择,也是项目是否具备工程化的一个分水岭,总而言之,学习Linux,Makefile足够的重要。

总结:

在Linux下,make是一个命令,Makefile是一个文件,二者相辅相成,共同实现项目的"自动化构建"。

二.Makefile逻辑

1.简单依赖

Makefile主要由依赖关系依赖方法组成,而依赖关系目标依赖组成

最经典的格式如下:

target:dependence  #依赖关系
  command          #依赖方法

其中,target是要生成的目标,dependence是要生成target所需要的依赖,两者组成一个依赖关系,而command是要生成target所要执行的命令。

注意:

  • 依赖关系中的依赖可以有多个,也可以没有
  • Makefile也可以写成makefile,写成其他make无法识别。(该文为Makefile)
  • 每条依赖关系前必须以【Tab】键开头

以我们上面的测试代码为例:

在这里插入图片描述
为了生成hello文件,需要依赖于hello.c文件,最后通过下面的依赖生成目标文件hello。

2.复杂依赖

上面测试用例中的依赖关系依赖为该目录下的文件,当依赖关系中的依赖不是该目录下的文件时,在生成目标文件时,系统就会自动在Makefile中的其它目标文件中查找相同的文件,如果找到的文件依然不在该目录下则重复进行上述操作。(系统采用栈的结果进行操作)

我们先将上面的测试用例修改如下:
在这里插入图片描述

  • 生成hello文件,依赖hello.o文件
  • 生成hello.o文件,依赖hello.s文件
  • 生成hello.s文件,依赖hello.i文件
  • 生成hello.i文件,依赖hello.c文件
  • hello.c文件在该目录下找到,直接使用

在我们生成一个hello文件同时生成了其它的三个目标文件,并存入该目录下
在这里插入图片描述

依赖关系如下图:

在这里插入图片描述

  • 其它目标文件的位置发生改变也不会影响target1的生成,依赖是在Makefile文件下查找相同的目标文件,和目标文件的位置没有关系。依然采用上面的方法生成文件。

三.make指令

1.make的使用

在Linux下,我们输入make命令后,系统会在当前目录下查找Makefile文件,找到后会执行文件中的第一个依赖关系和依赖方法,在屏幕打印出依赖方法并生成目标文件。

我们将上面的Makefile测试案例修改如下:
在这里插入图片描述
产生两组依赖关系。(clean下面会讲)

如下为我们通过make测试

在这里插入图片描述
当我们想要删生成Makefile中其他的目标文件时,需要通过指定目标文件方式

make target1 target2   #make后可以有多个target目标文件
  1. make target

在这里插入图片描述

  1. make target1 target2

在这里插入图片描述

2.clean清理

在一个工程中,总要对一些不需要的文件进行清理,我们常常使用clean来作为项目清理的目标文件。

因为清理文件不需要依赖其它文件,所以clean也不存在依赖关系。

当clean不是Makefile第一个目标文件时,我们需要在make后加clean来编译它,就像之前测试的那样。

在这里插入图片描述

3.伪目标

使用.PHONY修饰的目标,称为伪目标,格式如下

.PHONY:target

功能:使该文件总是可以被执行

当我们多次使用make去生成同一个目标文件时,第一次可以编译通过,但是之后,就无法通过,会给出如下结果:

在这里插入图片描述
这时我们就可以使用.PHONY来修饰目标文件hello,使其变成伪目标,总是可以被编译

在这里插入图片描述
注意:不是只有使用.PHONY修饰后才可以总是被编译,clean目标文件也可以总是编译,如下:

在这里插入图片描述

4.make如何确定是否编译

上面我们已经测试,在不使用.PHONY的情况下,make只能被使用一次,之后就无法被编译,那make是如何确定是否编译呢?

当我们在编写完成一个工程后,想要去执行实现这个工程,(一般工程都很大,不是我们测试的这么点)是需要浪费很多时间和性能的,我们不能让其肆无忌惮的执行,只有当源文件发生修改,后才可以重新实现这个工程生成可执行文件。

make判断是否重复编译,根据源文件和目标文件的修改时间对比判断。

  1. 当源文件的修改时间小于目标文件,不进行编译
  2. 当源文件的修改时间大于目标文件,进行编译

在Linux中,每个文件都有三个时间,如下:

  • 访问时间 (Access):最近访问文件内容时间,比如 cat、vim、less;
  • 修改时间 (Modify):最近修改文件内容时间,比如 nano、vim;
  • 改动时间 (Change):最近更改文件属性的时间,包括文件名、大小、内容、权限、属主、属组等,比如 nano/vim (文件大小改变),

我们可以通过stat指令来查看文件的这三种时间

在这里插入图片描述

访问时间的影响

为什么要对比两个数的修改时间来判断make是否重复编译呢?

在Linux下,访问一个文件可以通过cat、less指令来进行,而通过这两个指令访问后的文件不会修改它本身的访问时间,有以下两个原因:

  1. 在LInux中,访问文件是一个十分频繁的操作,而修改文件访问时间每次都需要进行IO操作,如果每次访问都对访问时间进行修改,那会增加系统的负担。
  2. 一个文件是否被读取是由这个文件的权限决定的,既然文件是可读的,那么说明文件的拥有者和所属组不建议你去读取,也就没必要每次修改访问时间了。

所以Linux访问时间改变有如下两种情况:

  1. 访问累计到一定的次数或积累一段时间会更新
  2. 文件的修改时间发生改变时,随之改变
    在这里插入图片描述

在这里插入图片描述

  • 上图只使用vim打卡文件,并未对其进行修改,但也会时修改时间改变

综上:如果要判断一个文件是否发生修改判断其修改时间是否发生变化即可。

注意:修改时间发生变化,文件不一定发生修改

修改时间的影响

当源文件的修改时间改变,说明源文件进行了修改,此时使用make即可再次编译,我们先使用vim更新修改时间判断
在这里插入图片描述
在这里插入图片描述
我们这里在使用touch命令来更新源文件的所有时间(touch file:file不存在创建file,file存在更新file所有时间),来判断make是否被执行和是否修改源文件内容无关。
在这里插入图片描述
我们从上面的知识可以得出结论make是否被编译和源文件的修改时间有关,那我们就可以知道,PHONY就是使目标文件是否被编译不根据修改时间来判断,从而达到总是被编译的效果。

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

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

相关文章

MySQL的客户端/服务器架构

以我们平时使用的微信为例,它其实是由两部分组成的,一部分是客户端程序,一部分是服务器程序。客户端可能有很多种形式,比如手机APP,电脑软件或者是网页版微信,每个客户端都有一个唯一的用户名,就…

赶紧收藏 | 50个超实用微信小程序,巨好用|||内含免费配音软件

现在App太多了,想用的功能都要下载,但是手机有258g内存不允许这么放肆呀,只能挖掘不占用存的方法了,小程序就解决了这个痛,节省内存,让手机不再卡顿,打游戏也舒服.给大家整理了50个很好用的小程…

【阶段三】Python机器学习11篇:机器学习项目实战:KNN(K近邻)回归模型

本篇的思维导图: 项目实战(KNN回归模型) K近邻算法回归模型则将离待预测样本点最近的K个训练样本点的平均值进行待预测样本点的回归预测。 项目背景 K近邻除了能进行分类分析,还能进行回归分析,即预测连续变量,此时的KNN称为K近邻回归模型。回归问题是一类…

synchronized 重量级锁分析

synchronized 重量级锁分析 1. 背景 在JDK1.6以前,synchronized 的工作方式都是这种重量级的锁。它的实现原理就是利用 kernel 中的互斥量,mutex。主要是内核中的mutex 能够保证它是一个互斥的量。如果线程1拿到了 mutex,那么线程2就拿不到了。这是内核帮我们保证…

二十三、Kubernetes中Pod控制器分类、ReplicaSet(RS)控制器详解

1、概述 Pod是kubernetes的最小管理单元,在kubernetes中,按照pod的创建方式可以将其分为两类: 自主式pod:kubernetes直接创建出来的Pod,这种pod删除后就没有了,也不会重建 控制器创建的pod:kub…

小米应用商店APP侵权投诉流程

目录一、官方指引二、侵权投诉流程1.侵权投诉通知和反通知流程2.受理渠道3.权利人发起侵权通知邮件一、官方指引 https://dev.mi.com/distribute/doc/details?pId1142 二、侵权投诉流程 1.侵权投诉通知和反通知流程 2.受理渠道 对外邮箱:developerxiaomi.com …

云呐|固定资产盘点APP

如果工人想做好他们的工作,他们想做好他们的工作。目前,行政事业单位对固定资产管理进行一物一卡一码管理,根据条形码粘贴和扫码总结,是目前科学完善的总结方法,具有快速、高效、准确的特点。对于这种方法,…

5.6、TCP超时重传时间的选择

超时重传时间的选择是 TCP 最复杂的问题之一 1、超时重传时间RTO的选取 假设主机 A 给主机 B 发送 TCP 数据报文段 000,并记录下当前的时间 主机 B 收到后,给主机 A 发送相应的确认报文段 主机 A 收到确认报文段后,记录下当前的时间 那么…

为什么BI仪表板的共享功能对企业如此重要?

随着大数据的发展,企业逐渐将数据作为其决策的重要组成部分,共享商业智能 (BI) 仪表板显得越来越重要。例如,在员工之间共享BI仪表板,不仅可以做出更好的数据驱动决策,还可以更好地提高工作透明度和问责制,…

Golang时间处理容易踩坑,小心损失百万

简介 在各个语言之中都有时间类型的处理,因为这个地球是圆的(我仿佛在讲废话),有多个时区,每个时区的时间不一样,在程序中有必要存在一种方式,或者说一种类型存储时间,还可以通过一系…

手写RPC框架第8版-通过SpringBoot-Starter接入SpringBoot

源代码地址:https://github.com/lhj502819/IRpc/tree/v9 系列文章: 注册中心模块实现路由模块实现序列化模块实现过滤器模块实现自定义SPI机制增加框架的扩展性的设计与实现基于线程和队列提升框架并发处理能力框架容错性相关设计通过SpringBoot-Starte…

LayoutInflater学习(二)之创建布局View

这篇是在上篇的基础上继续学习LayoutInflater,上篇主要讲了LayoutInflater是怎么解析布局的,但是并没有去仔细地说明LayoutInflater创建View的过程,这篇就补上这部分。 LayoutInflater创建xml布局View是分开创建的: 1. 先创建xml布局最外层的View,也就是布局的根View 2. 递归…

package.json和package-lock.json的区别

前言 今天正在写代码,同学突然问我,package.json和package-lock.json有什么区别,这两个文件有什么用?我愣住了… 模块化开发 经过这么多年的发展,现在的前端开发基本上都是模块化开发了。而node和npm则可以很方便的…

电网调频及一次调频、二次调频

电网调频的基本概念电力系统运行的主要任务之一是对电网频率进行控制—控制电网频率在50Hz附近的一个允许范围内。电网频率偏离额定值50Hz的原因是能源侧(水电、火电、核电……)的供电功率与负荷侧的用电功率之间的平衡被破坏而引起的。负荷的用电功率是…

Sentinel热点参数限流

何为热点? 何为热点?热点即经常访问的数据。很多时候我们希望统计某个热点数据中访问频次最高的 Top K数据,并对其访问进行限制。比如: 1)商品 ID 为参数,统计一段时间内最常购买的商品 ID 并进行限制&am…

正确的清理内存方式,才能让你的空间更加充裕

我们的手机用了一段时间后,有没有感觉卡变了,运行速度也很慢?估计是手机内存不足造成的,今天就来教教大家如何快速清理空间。方法一:清除微信缓存文件 我们每天都用微信。 其实它最占内存,我们还需要定时打…

原子化带来化学反应,视频号万粉创作者增加3倍,点赞10w+的爆款内容增长186%

1月10日,以“在场”为主题的2023微信公开课PRO正式开讲。本年度微信公开课重点从视频号内容生态发展、微信生态内各类产品助力实体转型以及数字生活服务升级三个方面,展示微信生态各产品的新能力、新计划。在2022年的微信公开课Pro上,“视频号…

广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”

文章目录广告业务系统 之 数据中转站 —— “日志中心-实时服务监控”日志中心实时服务监控 —— 前链路日志分析日志收敛手段 —— “手术开口”基于 metrics 的日志分析 —— Prometheus & Graphite监控服务是怎么监控自身 & 比常规服务更坚强高扩展、高性能的架构设…

[L1 - 5分合集]心理阴影面积

L1-060 心理阴影面积 分数 5 作者 陈越 单位 浙江大学 题目: 这是一幅心理阴影面积图。我们都以为自己可以匀速前进(图中蓝色直线),而拖延症晚期的我们往往执行的是最后时刻的疯狂赶工(图中的红色折线)。由…

外贸邮件营销的优势

邮件营销相对于其他营销方式,历史更悠久。邮件营销具有成本低廉、快速、精准的特点。那么邮件营销有哪些优势,才能获得如此的关注。接下来,米贸搜和大家分享一下邮件营销的优势。1.节约成本的考虑:当前,世界经济复苏乏力&#xff…