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

news2025/1/11 12:51:26

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

  • 什么是make/makefile?
  • make/makefile的使用
    • 依赖关系
    • 依赖方法
    • makefile是如何工作的?
    • 为什么要使用makefile呢?
    • makefile是怎么做到的呢?
    • make和make clean
      • .PHONY:伪目标
  • 特殊符号
  • 🍀小结🍀

🎉博客主页:小智_x0___0x_

🎉欢迎关注:👍点赞🙌收藏✍️留言

🎉系列专栏:Linux入门到精通

🎉代码仓库:小智的代码仓库

什么是make/makefile?

  • 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作。
  • makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
  • make是一个命令工具,是一个解释makefile中指令的命令工具,一般来说,大多数的IDE都有这个命令,比如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,makefile都成为了一种在工程方面的编译方法。
  • make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建

make/makefile的使用

我们之前编译程序要使用gcc/g++的各种指令来进行编译>
比如我们建立一个mycode.c:
在这里插入图片描述
在没有学习make/makefile之前我们想要编译这段代码需要使用这行指令gcc -o mycode mycode.c我们编译来看:
在这里插入图片描述
可以看到程序可以被编译执行。
我们再来使用make/makefile来进行操作:

  1. 首先创建一个空白文件makefile/Makefile(首字母大小写都可以):
    w
  2. 使用vim编辑器打开文件:
    在这里插入图片描述
    在文件中写入这些代码,保存并退出。
  3. 终端输入make进行代码编译:
    在这里插入图片描述
    可以看到使用make指令,也可以对代码进行编译,也不用我们每次都去敲那么长的gcc指令,而且还很容易敲错。
  4. 使用make clean对项目进行清理。
    在这里插入图片描述
    可以看到的确清理了我们生成的可执行程序。

依赖关系

我们来看makefile中的内容:
在这里插入图片描述
第一行就代表依赖关系,意思就是mycode的生成要依赖于mycode.c
这里举个例子:

小李到了月末给他自己的父亲打了个电话要生活费。

小李为什么要给他父亲打电话而不是给他室友的父亲打电话要生活费呢,这是因为,小李和他父亲是依赖关系,小李依赖于他的父亲,而小李跟他室友的父亲没有任何关系。

依赖方法

在这里插入图片描述
这一行缩进的就代表依赖方法,意思是要执行的指令。
再使用上面的例子进行解释就是:
小李打电话提到的要生活费就是打电话的主要目的,而实行要生活费的这个操作就是依赖方法。

makefile是如何工作的?

在这里插入图片描述
我们把上篇学到的预处理编译链接的过程也加到makefile中,再来使用make指令>
在这里插入图片描述
可以看到他也生成了对应的文件,而且我们上面也没有按照程序的执行顺序来写,makefile也可以帮我们完成,这可以说明make会自动推导makefile中的依赖关系
那如果我们再makefile中删去一行指令那么程序还可以继续正常执行吗?
我们来试试看>
在这里插入图片描述
可以看到给我们报错说要产生mycode.o需要依赖mycode.s,而我们刚刚正好删除了生成mycode.s文件的那两行代码

为什么要使用makefile呢?

使用Makefile的主要目的是为了自动化构建和管理项目。Makefile是一个文本文件,其中包含了一系列规则和命令,用于告诉构建工具如何编译、链接和生成项目中的各个组件。

下面是使用Makefile的几个重要原因:

  1. 自动化构建:Makefile可以定义一系列构建规则和依赖关系,使得整个项目的构建过程变得自动化。通过运行make命令,构建工具会根据Makefile中定义的规则判断需要重新编译哪些文件,并自动执行相应的编译、链接操作,从而减少手动操作和避免人为错误。

  2. 管理复杂的项目:在大型项目中,可能涉及多个源文件、库文件和配置文件之间的复杂依赖关系。Makefile可以让您清晰地定义这些依赖关系,确保正确的文件被编译和链接,以及正确的文件被重建。

  3. 跨平台使用:Makefile是跨平台的构建工具,可以在不同的操作系统上使用。它支持各种编程语言和开发环境,使得项目在不同平台上具有一致的构建方式。

  4. 增量编译:Makefile利用文件的时间戳来确定是否需要重新编译某个文件。只有当文件的依赖发生变化或文件本身被修改时,相关的规则才会重新执行。这种增量编译的机制可以大幅提升项目的构建效率,避免不必要的重复工作。

  5. 高度可定制:Makefile具有很高的灵活性和可定制性。您可以根据项目的需求定义自己的规则和命令,满足特定的构建和部署需求。您还可以轻松地扩展Makefile,添加新的目标、参数或规则,以适应项目的变化。

综上所述,使用Makefile可以提高项目的开发效率、降低出错的可能性,简化构建过程并实现自动化管理,特别适用于较大、复杂的软件项目。

makefile是怎么做到的呢?

我们再来使用make来编译源代码:
在这里插入图片描述
我们再在已经编译的基础上再次使用make指令>
在这里插入图片描述
可以看到make拒绝的我的操作。这是因为生成的可执行程序是最新的。
一定是源文件形成的可执行,先有源文件,才有可执行,一般而言,源文件的最近修改时间 比可执行修改时间要老的!
如果我更改了源文件,历史上曾经还有可执行程序,那么源文件的修改时间,一定是比可执行程序要新的,这是我们再使用make就可以完成代码的编译。
因此只需要比较可执行程序的修改时间 和 源文件的修改时间

  1. .exe 新于 .c 源文件是老的,不需要重新编译
  2. .exe 老于 .c 源文件是新的,需要重新编译

一般而言.exe!=.c
这里有一个stat指令可以查看文件所对应的时间
在这里插入图片描述

  • Access(访问):表示获取或读取数据或文件的操作。当您执行访问操作时,您可以查看或检索数据的内容或状态,而不会改变其原始内容。例如,访问一个文件可以读取文件的内容或元数据,但不会对文件进行修改。

  • Modify(修改):表示对数据或文件进行更改的操作。当您执行修改操作时,您会对数据或文件进行更改,以更新其内容或状态。这可能涉及编辑、添加、删除等操作,以使数据或文件发生变化。例如,修改一个文本文件可以编辑文件的内容并保存修改后的版本。

  • Change(变更):是一个更广泛的术语,通常用于表示对数据或文件进行任何形式的更改。它可以包括访问和修改以及其他操作。"Change"一词没有具体指明执行了哪些操作,因此具体操作的含义可能需要根据上下文来确定。

make会根据源文件的新旧和目标文件的新旧(根据Modify时间进行比较),判定是否需要重新执行依赖关系进行编译。

make和make clean

在这里插入图片描述
为什么使用make可以直接执行源文件编译操作,而项目清理需要使用makefile呢?
我们来吧两个顺序颠倒一下试试看:
在这里插入图片描述
通过这个例子我们可以得出make指令的操作是执行makefile中的第一个依赖关系。

.PHONY:伪目标

通过上面我们可以了解到依赖关系不一定总是执行的,那如果我们想让依赖关系总是执行呢?
这里可以通过.PHONY:伪目标具体使用方法:
在这里插入图片描述
这就好比我们告诉makefile以后遇到mycode就不要阻拦了,让他直接操作。
这个一般多用于修饰clean:

特殊符号

makefile中可以简写可以使用 $@ 代替要生成的目标文件,用 $^代表目标文件:
在这里插入图片描述
如果执行make或者make clean之后不想看到指令回显可以在指令前面加上@修饰:
在这里插入图片描述

🍀小结🍀

今天我们学习了Linux项目自动化构建工具-make/makefile相信大家看完有一定的收获。
种一棵树的最好时间是十年前,其次是现在! 把握好当下,合理利用时间努力奋斗,相信大家一定会实现自己的目标!加油!创作不易,辛苦各位小伙伴们动动小手,三连一波💕💕~~~,本文中也有不足之处,欢迎各位随时私信点评指正!

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

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

相关文章

Vue 之 mixins 和 provide/inject

一、mixins 1、简介 ​ mixins 又称 混入,是指将一些可复用的代码(JS、生命周期钩子函数等等)抽离出来,定义成mixins模块,然后混入到多个组件中,从而实现组件间的逻辑代码共享,减少重复代码。…

Nginx正向代理、反向代理,动静分离

目录 正向代理 反向代理 动静分离 正向代理 正向代理最大的特点是客户端非常明确要访问的服务器地址;服务器只清楚请求来自哪个代理服务器,而不清楚来自哪个具体的客户端;正向代理模式屏蔽或者隐藏了真实客户端信息。 反向代理 客户端给服…

C#(四十六)之基于流的文件操作(FileStream)

FileStream类属性和方法 属性 CanRead 指示当前文件流是否支持读取 CanWrite 指示当前文件流是否支持写入 CanSeek 指示当前文件流是否支持查找 IsAsync FileStream是同步打开还是异步打开 Length 流的长度(字节数) CanTimeOut 当前文件流是否可以…

【C++进阶】哈希表

文章目录 前言哈希概念哈希冲突哈希函数哈希冲突解决一.闭散列解决哈希冲突1. 线性探测2.二次探测 二、闭散列的实现1.准备2.闭散列插入3.闭散列查找4.闭散列删除 三、闭散列完整源码四、开散列解决哈希冲突1.开散列概念2.哈希桶的结构3.哈希桶的插入4.哈希桶的查找5.哈希桶的删…

学习多线程

1、学习线程池 1.1jdk中的线程池 推荐使用ThreadPoolExecutor 1.1.1先了解参数的意义 首先看下ThreadPoolExecutor的构造函数 public ThreadPoolExecutor(int corePoolSize,int maximumPoolSize,long keepAliveTime,TimeUnit unit,BlockingQueue<Runnable> workQueu…

对话e签宝,解读 SaaS圈“头部玩家”的增长故事

可以肯定的是&#xff0c;未来3年&#xff0c;整个中国SaaS市场会逐步确认船票分配。穿越周期&#xff0c;告别不确定的三年&#xff0c;给幸存下来的企业上了淋漓生动的一课。在新的起点上&#xff0c;SaaS也需要一种新的打开方式。谁扎得牢、想得透、做的好、跑得快&#xff…

Docker数据卷和数据卷容器应用

学习目的 掌握Docker数据卷和数据卷容器使用方法。 学习准备 要求实验主机能够连接外网&#xff0c;已经正确安装Docker&#xff0c;并关闭防火墙和selinux。 学习步骤 步骤1&#xff1a;创建数据卷 &#xff08;1&#xff09;创建容器&#xff0c;为容器添加一个数据卷&…

基于树莓派4B与STM32的智能门禁系统项目(代码开源)

前言&#xff1a;本文为手把手教学嵌入式经典项目——智能门禁项目&#xff0c;本次项目采用 树莓派4B 与 STM32F103C8T6 进行联合开发。项目充分发挥各自 CPU 的优势与长处&#xff0c;将人脸识别的大计算量任务给树莓派4B&#xff0c;将门禁系统的控制部分交给 STM32 进行处理…

外包干了2个月,技术退步明显...

先说一下自己的情况&#xff0c;大专生&#xff0c;18年通过校招进入湖南某软件公司&#xff0c;干了接近4年的功能测试&#xff0c;今年年初&#xff0c;感觉自己不能够在这样下去了&#xff0c;长时间呆在一个舒适的环境会让一个人堕落!而我已经在一个企业干了四年的功能测试…

举个栗子!Quick BI 技巧(1):创建趋势折线图

自 2016 年以来&#xff0c;优阅达《举个栗子》内容专栏已陪伴众多企业用户高效工作&#xff0c;解决真实业务场景中的用数问题。 2023 年&#xff0c;全新系列《举个栗子&#xff01;Quick BI 技巧》出炉啦~ 优阅达期待能够持续分享经验&#xff0c;帮助用户发现更多 Quick …

剑指 Offer. 二叉树中和为某一值的路径

给你二叉树的根节点 root 和一个整数目标和 targetSum &#xff0c;找出所有 从根节点到叶子节点 路径总和等于给定目标和的路径。 叶子节点 是指没有子节点的节点。 示例 1&#xff1a; 输入&#xff1a;root [5,4,8,11,null,13,4,7,2,null,null,5,1], targetSum 22 输出&…

ATA3000系列功率放大器——水声信号中的典型应用

ATA3000系列功率放大器——水声信号中的典型应用 水声领域介绍&#xff1a; 主动声纳是通过声纳本身发射声波&#xff0c;根据声信号反射回波来发现目标&#xff0c;并测定目标的位置和运动参数。水声信号发射机在主动声纳设备中是非常重要的组成部分&#xff0c;其产生特定形式…

YoloV5/YoloV7改进---注意力机制:引入瓶颈注意力模块BAM,对标CBAM

目录 1.BAM介绍 2.BAM引入到yolov5 2.1 加入common.py中&#xff1a; 2.2 加入yolo.py中&#xff1a; 2.3 yolov5s_BAM.yaml 1.BAM介绍 论文&#xff1a;https://arxiv.org/pdf/1807.06514.pdf 摘要&#xff1a;提出了一种简单有效的注意力模块&#xff0c;称为瓶颈注意力模块…

【数据仓库】Apache Doris介绍

Apache Doris介绍 Apache Doris应用场景 Apache Doris核心特性 Apache Doris架构 Doris数据模型三种 Aggregate模型介绍 Uniq模型介绍 在某些多维分析场景下,用户更关注的是如何保证Key的唯一性Key 唯一性约束。因此&#xff0c;我们引入了 Unig 的数据模型。该模型本质上是聚…

微信如何创建自己的小程序?

微信如何创建自己的小程序&#xff1f;微信小程序成为了很多商家、企业甚至是个人在互联网中的营销工具&#xff0c;微信小程序基本上可以说是属于必备工具。那么微信如何创建自己的小程序呢&#xff1f;下面一起来给大家说说。 一、注册小程序账号 微信如何创建自己的小程序…

12.JavaWeb-Node.js

1.Node.js的概念 传统的Web服务器中&#xff0c;每个请求都会创建一个线程&#xff0c;这会导致线程数的增加&#xff0c;从而影响服务器的性能和扩展性&#xff0c;Ryan Dahl借助Chrome的V8引擎提供的能力实现了Node.js——可以在服务端运行的JavaScript&#xff08;可以把Nod…

win下实现Linux的tab自动补全

声明 &#xff1a;如果不是确定的话 注册表这个东西不建议更改 如果更改的话建议先备份系统 以防意外 1.找到注册表编辑器 2. 展开HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Command Processor 3.找到Completion Char 双击 把橙色的数值改成9 4.重新打开cmd 就可以了 参考文章…

【Python数据处理】-Pandas笔记

Python数据处理-Pandas笔记 &#x1f4dd; 基本概念 Pandas是一个强大的Python数据处理库&#xff0c;它提供了高效的数据结构和数据分析工具&#xff0c;使数据处理变得简单而快速。本篇笔记将介绍Pandas中最常用的数据结构——Series和DataFrame&#xff0c;以及数据处理的…

48. Compose自定义绘制日历-2

这次的实现方式完全改了&#xff0c;感觉最初的想法对切换周历模式比较难实现&#xff0c; 现在是把月历和周历 同时生成&#xff0c;动态切换。 待优化的&#xff1a;切换的时候 闪动没那么丝滑。 还有另一种实现方案 &#xff1a; 只生成当前月份 和前后月份三组数据&#x…

HTML5网页设计小案例:逸仙园茶馆招聘启事网页的设计

前言&#xff1a; 今天分享的逸仙园茶馆招聘启事网页的设计是本专栏的第一篇博客&#xff0c;也是我学习了几个小时知识点后写的实战小案例。我有个想法&#xff0c;想以逸仙园茶馆为灵感不断优化改进代码与想法设计一套与茶叶有关的的精美网页 逸仙园茶馆招聘启事网页的设计案…