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

在这里插入图片描述

👦个人主页: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.mzph.cn/news/171796.shtml

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

相关文章

Node.js下载安装及配置镜像源

一、进入官网地址下载安装包 https://nodejs.org/dist 选择对应你系统的Node.js版本 这里我选择的是Windows系统、64位 二、安装程序 &#xff08;1&#xff09;下载完成后&#xff0c;双击安装包&#xff0c;开始安装Node.js (2)直接点【Next】按钮&#xff0c;此处可根据…

jmeter 接口测试快速入门 以飞致云平台为例

飞致云电商API地址系统来自飞致云项目。接口API地址&#xff1a;https://gz.fit2cloud.com/swagger-ui.html 飞致云电商系统接口文档 V1.0&#xff1a;见 有道云笔记 该网站可以做接口测试练习。快速了解如何测试接口&#xff0c;如何做关联 系统基地址&#xff1a;https://g…

树套树 (线段树+splay)

树套树&#xff0c;就是线段树、平衡树、树状数组等数据结构的嵌套。 最简单的是线段树套set&#xff0c;可以解决一些比较简单的问题&#xff0c;而且代码根线段树是一样的只是一些细节不太一样。 本题中用的是线段树套splay&#xff0c;代码较长。 树套树中的splay和单一的…

【数据结构】堆(C语言)

今天我们来学习堆&#xff0c;它也是二叉树的一种&#xff08;我滴神树&#xff01;&#xff09; 目录 堆的介绍&#xff1a;堆的代码实现&#xff1a;堆的结构体创建&#xff1a;堆的初始化&#xff1a;堆的销毁&#xff1a;堆的push&#xff1a;堆的pop&#xff1a;判空 &am…

力扣373场周赛题解

第一题&#xff1a; 这个题是一个简单题&#xff0c;数据范围也特别小&#xff0c;所以直接使用模拟方式暴力解答。 直接进行行移动的过程&#xff0c;然后检查移动后的结果是否与移动前相同。 代码&#xff1a; ​ public class Solution {// 将指定行循环右移k次pri…

6.前端--CSS-基础选择器【2023.11.26】

1.CSS基本选择器 标签选择器&#xff1a; 标签选择器&#xff08;元素选择器&#xff09;是指用 HTML 标签名称作为选择器&#xff0c;按标签名称分类&#xff0c;为页面中某一类标签指定统一的 CSS 样式。标签选择器可以把某一类标签全部选择出来&#xff0c;比如所有的 <…

ns-3安装教程

1️⃣ VMware安装Ubuntu虚拟机 VMware安装Ubuntu 18.04虚拟机 6.桥接模式网络配置往后都不看 VMware16 安装Ubuntu22.04.1 服务器版操作系统教程 这块主要看怎么从清华镜像下载ubuntu 本人安装的是ubuntu22.04.3 2️⃣ 安装ns3 【ns-3】零基础安装教程 安装依赖库时遇到了问题 …

Bun 1.0 正式发布,爆火的前端运行时,速度遥遥领先!

目录 Bun Github 41.6k 另外&#xff0c;Bun.js 原生支持了数百个 Node.js 和 Web API&#xff0c;包括约 90% 的 Node-API 函数(fs、path、Buffer 等)。 一、包子1.0Bun 1.0终于来了。 二、Bun 是一个一体化工具包 为什么包子存在 Bun 的目标很简单&#xff1a;消除缓慢…

现货黄金区间交易的两个要点

在现货黄金市场中&#xff0c;我们常碰到横盘区间行情。有区间&#xff0c;就终究会出现突破&#xff0c;因为金价不可能缺乏方向而一直在区间内运行。那既然要突破&#xff0c;我们又应当如何应对和交易呢&#xff1f;下面我们就来讨论一下。 切忌在突破发生时马上跟随突破方向…

个人成长|信奉长期主义,就要多做可积累有复利的事。

哈喽啊&#xff0c;大家好&#xff0c;我是雷工&#xff01; 最近有个哥们儿吐槽&#xff0c;说他们公司人事找他谈话&#xff0c;要给降工资&#xff0c;他不同意。 过了没几天又说&#xff1a; “定了&#xff0c;全员降薪”。 “你同意了&#xff1f;” “不同意&#xff0…

CV计算机视觉每日开源代码Paper with code速览-2023.11.21

点击CV计算机视觉&#xff0c;关注更多CV干货 论文已打包&#xff0c;点击进入—>下载界面 点击加入—>CV计算机视觉交流群 1.【基础网络架构&#xff1a;Transformer】Multi-entity Video Transformers for Fine-Grained Video Representation Learning 论文地址&…

Qt 串口编程-从入门到实战

1. Qt 串口通信流程解析 1.1 串行通信和并行通信对比 并行通信适合距离较短的通信&#xff0c;且信号容易受干扰&#xff0c;成本高串口通讯-设备&#xff08;蓝牙&#xff0c; wifi&#xff0c; gprs&#xff0c; gps&#xff09; 1.2 Qt 串口通信具体流程 1. 创建 QSerial…

Java基于springboot+vue开发服装商城小程序

演示视频&#xff1a; 小程序 https://www.bilibili.com/video/BV1rM411o7m4/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae139b 管理员 https://www.bilibili.com/video/BV1fc411D7V3/?share_sourcecopy_web&vd_source11344bb73ef9b33550b8202d07ae…

计算机中vcomp140.dll丢失的解决方法,一键修复vcomp140.dll缺失问题

vcomp140.dll是Visual C 2015 Redistributable的一个组件&#xff0c;它是运行一些基于Visual Studio开发的软件所必需的。当你在运行某些程序时&#xff0c;可能会遇到“找不到vcomp140.dll”的错误提示&#xff0c;这通常是由于系统缺少这个组件导致的。本文将介绍vcomp140.d…

服务运营 |精选:病人向何处去?医院调度的几种建模方法(上)

推文作者&#xff1a; Shutian Li 编者按&#xff1a; 住院流程&#xff08;Inpatient Flow&#xff09;是一种通过协调和优化医院内部流程&#xff0c;以提高患者入院至出院期间的效率和质量的方法。住院流程通常通过医院内部信息系统和协同工作流程进行管理&#xff0c;以确…

ArcGIS中基于人口数据计算人口密度的方法

文章目录 一、密度分析原理二、点密度分析三、线密度分析四、核密度分析一、密度分析原理 密度分析是指根据输入的要素数据集计算整个区域的数据聚集状况,从而产生一个联系的密度表面。通过密度计算,将每个采样点的值散步到整个研究区域,并获得输出栅格中每个像元的密度值。…

C语言——深入理解指针(2)

目录 1. 数组名 2. 指针访问数组 3. 一维数组的传参&#xff08;本质&#xff09; 4. 冒泡排序 5. 二级指针 6. 指针数组&#xff08;指针的数组&#xff09; 7. 指针数组模拟二维数组 1. 数组名 在之前的代码中我们使用指针访问过数组的内容。 int arr[10] {1,2,3,4…

针对c语言的scanf读取字符和字符串解析

在scanf函数中&#xff0c;格式字符串里的空格字符有特定的作用。 当你在格式字符串里放置一个空格时&#xff0c;scanf会尝试匹配并消耗输入中的一个或多个空白字符&#xff08;包括空格、制表符或换行符&#xff09;。换句话说&#xff0c;它会跳过任何空白字符&#xff0c;…

jQuery_09 事件的绑定与使用(on)

jQuery使用on绑定事件 jQuery可以给dom对象添加事件 在程序执行期间动态的处理事件 1. $("选择器").事件名称(事件处理函数) $("选择器") &#xff1a; 选择0或者多个dom对象 给他们添加事件 事件名称&#xff1a;就是js中事件名称去掉on的部分 比如单击…