(Linux) make/makefile的简单介绍以及使用

news2025/2/27 5:45:53

  • make和makefile的功能
  • make和makefile的使用规则

make和makefile的功能

什么是make和makefile,它有什么作用?我相信这是大部分人在刚接触make和makefile时疑惑。那我们就一起来看看它的答案吧。
make是一条命令,makefile是一个文件,两个搭配使用,完成项目自动化构建。
一个大工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,如果每次都要我们输入gcc命令进行编译的话,那对我们来说简直就是一件非常可怕的事情。而如果利用make工具,我们可以将大型的开发项目分解成为多个更易于管理的模块,对于一个包括几百个源文件的应用程序,使用make和makefile工具就可以简洁明快地理顺各个源文件之间纷繁复杂的相互关系。 make工具可自动完成编译工作,并且可以只对程序员在上次编译后修改过的部分进行编译。 因此,有效的利用make和makefile工具可以大大提高项目开发的效率。

make和makefile的使用规则

看完上面这段介绍,我知道make和makefile的作用了,那又怎么去使用呢?
我们要知道make和makefile的核心规则是依赖关系和依赖方法

依赖关系里分为目标文件和依赖文件:
目标文件:通常是要产生的文件名称,目标文件可以是可执行文件。

依赖文件:是用来输入从而产生目标的文件,一个目标文件通常由几个依赖文件生成(比如由好几个源文件来编译链接出某一个可执行文件)。

依赖方法:

说简单点就将依赖文件生成目标文件的命令。

下面我们通过一个实列来进一步了解。

先创建两个文件,分别是test.c和Makefie
在这里插入图片描述分别对两个文件进行编辑

在这里插入图片描述
使用make命令,生成了目标文件mycode ./mycode 运行可执行程序 就打印出了运行结果。这就是make与makefile的简单使用。

在这里插入图片描述在Makefile文件里配置clean进行清空,当我们不需要生成的可执行程序文件时,使用 make clean 命令就可以完成对文件的清理工作。
在这里插入图片描述
从上面我们可以发现在使用make命令编译时什么都不加但是为什么清理时就需要加make clean,那是因为make在执行makefile文件里的内容时,从上往下执行,第一个依赖关系和依赖方法执行完之后就停止了,第一个make mycode 的mycode可以省略 ,但是第二个起就不能省略了,只能完整的使用 如:make clean 。

下图中我们可以发现,当执行了一次make命令之后,再去执行make命令就会提示make:xxxx is to date,这是说明不能连续的make ,但是连续的make clean 却不会报错:
在这里插入图片描述
原因是在makefile:中在clean 前加了一个 .PHONY 这个指令代表这一指令总是被执行,所以连续执行make clean不会提示。不能连续编译,是编译器的一种只能检查的表现,源文件在没有改变的情况下就没必要进行再编译,这里我们感受不出来它的必要性,对于一个大项目来说重新编译会浪费时间也没有必要,这也正是make/Makefile 的优势。
那编译器是怎么识别这个程序需不需要重新编译?(注意这个编译不是指所有源文件都重新编译,而是只将被改变了的源文件及依赖于它的目标文件进行重新编译

这是根据文件里关于时间属性来判断的(众所周知,Linux中的文件包括内容和属性)

在这里插入图片描述

每个文件都有三个时间:

1.Access:访问文件的时间

2.Modify:修改文件内容的时间(修改了我呢见内容,那文件属性就一定会发生改变)

3.Change:修改文件属性的时间

每次访问文件不一定修改Access的时间,因为访问文件发生的可能性是最大的,要是每一次访问都修改时间,那对于系统来说是一个很大的工程,访问文件的时间也没有那么重要,所以多次访问,当访问次数达到设定值就会改变一次文件的 Access的时间。文件的大小发生改变,那Modify的时间就会改变,文件的大小是文件的属性,所以Change的时间也一定会改变。Change的时间会随着用户chmod 手动改变文件的属性而改变。touch xxx 可以更新xxx文件的这三个属性。

源文件的Modify 没有改变,在已经编译好的情况下,就没有必要进行再编译,所以编译器只用比较依赖文件的Modify和目标文件的Modify时间,判断需不需要重新编译。若源文件的Modify 时间更新则可以进行再编译,不然就进行不编译。如果加了.PHONY ,系统就不会根据自己的判断去决定指令该不该执行,而是总是执行指令。

Makefile中还有一些自动化变量,常用的有如下几种:

自动化变量说明
$@规则的目标
$^所有的依赖的列表,会自动去重
$<规则的第一个依赖
$?所有比目标新的依赖的列表

如下是在依赖方法中使用了自动化变量$@ 和 $^
在这里插入图片描述以上就是关于make/Makefile的相关介绍了,如果有不到位的地方,欢迎大家及时指正。

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

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

相关文章

基于ZC序列的帧同步

Zadoff-Chu序列是一种特殊的序列&#xff0c;具有良好的自相关性和很低的互相关性&#xff0c;这种性能可以被用来产生同步信号&#xff0c;作为对时间和频率的相关运算在TD-LTE系统中&#xff0c;Zadoff-Chu(ZC)序列主要应用于上行RS序列生成、PRACH前导序列生成以及主同步信号…

CIMCAI mature AI product, digital port intelligent port waterway

全球港航人工智能领军企业中集飞瞳CIMCAI&#xff0c;成熟港航人工智能产品全球领先&#xff0c;核心技术世界顶尖水平数字化港航自动化。全球集装箱人工智能AI领军企业CIMCAI中集飞瞳&#xff0c;全球航运港口高科技领军企业&#xff0c;率先将港口人工智能Ceaspectus™产品做…

python入门(六) opencv的安装,图片操作,绘制文字图形,视频操作

文章目录课程目标认识openCV如何安装openCVOpenCV 读取、缩放、翻转、写入图像读取图片缩放图片翻转图片写入图片openCV绘制图形和文字创建一个纯黑色的底图画一个矩形再画一个正方形再画一个圆形再画一个实心圆画一条线画多边形在真实的图片上加载图形在真实的图片上加载文字O…

创建菜单栏、菜单、菜单项

1、QMainWindow窗口 1.1、创建菜单栏 this 代表的是 当前窗口&#xff08;主窗口&#xff09;&#xff0c;也就是 当前窗口中添加/设置 菜单栏 this->resize(800,600); //创建 菜单栏 QMenuBar *menuBar new QMenuBar(this); //将菜单栏 添加到主窗口的特殊位置 this-&g…

第12届蓝桥杯省赛真题剖析-2020年12月20日Scratch编程初级组

[导读]&#xff1a;超平老师的《Scratch蓝桥杯真题解析100讲》已经全部完成&#xff0c;后续会不定期解读蓝桥杯真题&#xff0c;这是Scratch蓝桥杯真题解析第123讲。 第12届蓝桥杯省赛举办了两次&#xff0c;这是2020年10月20日举行的第一次省赛初级组试题&#xff0c;比赛仍…

<STM32>STM32CubeMX-串口收发通信(DMA传输)(6)

&#xff1c;STM32&#xff1e;STM32CubeMX-串口收发通信(DMA传输)&#xff08;6&#xff09; 本节主要讲解串口DMA通信的功能&#xff0c;主要采用DMA接收数据的方式&#xff1b; DMA、串口的详细解说可参考《STM32F4XXX中文参考手册》&#xff0c;资料有详细的讲解和说明&am…

【机器视觉------标定篇(二)】三点成圆算法(求相机旋转中心)

应用场景 机器视觉项目应用中&#xff0c;相机安装在机器人上&#xff0c;并且需要定位产品返回坐标偏差以及角度偏差。 与九点标定配合使用&#xff0c;实现精准角度补偿。 算法输入 不共线的三点坐标 A&#xff08;X₁,Y₁&#xff09; &#xff0c;B&#xff08;X₂,Y₂&…

关于加解密方法报错java.security.InvalidKeyException: Illegal key size

1、找到自己的jdk安装路径下去&#xff1b; 2、找到java.security查看是否存在#crypto.policyunlimited,如果有把该#号去掉&#xff0c;注释打开&#xff1b; 3、若java.security文件中不存在#crypto.policyunlimited&#xff0c;则应该去从官网下载jce策略文件&#xff08;补丁…

springboot+vue旧物置换网站(完整源码+文档)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的旧物置换网站。项目源码请联系风歌&#xff0c;文末附上联系信息 。 目前有各类成品java毕设&#xff0c;需要请看文末联系方式 。ja…

Python|基于粒子群和遗传算法的微电网优化调度

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

Hadoop2.0伪分布式平台环境搭建

一、搭建环境的前提条件 环境&#xff1a;ubuntu-16.04 hadoop-2.6.0 jdk1.8.0_161。这里的环境不一定需要和我一样&#xff0c;基本版本差不多都ok的&#xff0c;所需安装包和压缩包自行下载即可。 因为这里是配置Hadoop的教程&#xff0c;配置Java以及安装VMware Tools就自行…

为什么2017年之后操作系统仍将扮演重要角色?

操作系统的历史虽然不像计算科学那么久远&#xff0c;但却也已经拥有相当可观的发展历程。大型机客户于上世纪五十年代末编写了第一批操作系统&#xff0c;这些系统直到数十年后的今天仍拥有相当的知名度——其中包括来自IBM公司的OS/360以及贝尔实验室打造的Unix。 在可预期的…

详解二叉搜索树 --- key模型和key/value模型

&#x1f340;作者&#xff1a;阿润菜菜 &#x1f4d6;专栏&#xff1a;数据结构 一、认识二叉搜索树的key模型和key/value模型 key的模型是指每个节点只有一个键值&#xff0c;用于确定节点在树中的位置。节点的键值必须满足二叉搜索树的性质&#xff0c;即左子节点的键值小于…

SpringBoot 中使用Guava实现单机令牌桶限流

SpringBoot项目中如何对接口进行限流&#xff0c;有哪些常见的限流算法&#xff0c;如何优雅的进行限流。 首先就让我们来看看为什么需要对接口进行限流&#xff1f; 为什么要进行限流&#xff1f; 因为互联网系统通常都要面对大并发大流量的请求&#xff0c;在突发情况下&a…

你还还还没学会RabbitMQ?-----------RabbitMQ详解及快速入门(工作模式)

你像天外来物一样&#xff0c;求之不得&#xff08;咳咳&#xff0c;指offer&#xff09;&#x1f339; 文章目录什么是MQ&#xff1f;MQ的优势与劣势使用MQ需要满足的条件常见的MQ产品关于RabbitMQ生产者消费者工作模式订阅模式路由模式通配符模式什么是MQ&#xff1f; Messa…

机器学习——支持向量机的训练

目录 实践SVM分类 测试1-1​编辑 测试1-2 SVM核心 支持向量机函数 分类器SVC的主要属性: 分类器SVC的主要方法: 回归器SVR的主要属性: 支持向量机在鸢尾花分类中的应用 实践SVM分类 (1)参数C的选择: C为惩罚系数,也称为正则化系数: C越小模型越受限&#xff08;即单个数据…

【设计模式】从Mybatis源码中学习到的10种设计模式

文章目录一、前言二、源码&#xff1a;学设计模式三、类型&#xff1a;创建型模式1. 工厂模式2. 单例模式3. 建造者模式四、类型&#xff1a;结构型模式1. 适配器模式2. 代理模式3. 组合模式4. 装饰器模式五、类型&#xff1a;行为型模式1. 模板模式2. 策略模式3. 迭代器模式六…

长江流域9省2市可视化(不展示业务信息水质及真实断面)

一、处理9省2市地理信息为geojson集成到项目 shp转geojson关键Java代码 /*** shp转换为Geojson* param shpPath* return*/ public static Map shape2Geojson(String shpPath,String filePath){Map map new HashMap();FeatureJSON fjson new FeatureJSON();try{StringBuffer …

阶段二33_面向对象高级_IO[转换流,对象流]

知识点&#xff1a; 1.转换流&#xff1a;InputStreamReader&#xff0c;OutputStreamWriter2.对象流&#xff1a;ObjectInputStream&#xff0c;ObjectOutputStream一.转换流 1.转换流原理图 2.转换流概述 转换流就是来进行字节流和字符流之间转换的 InputStreamReader是从…

p75 应急响应-数据库漏洞口令检索应急取证箱

数据来源 必须知识点&#xff1a; 第三方应用由于是选择性安装&#xff0c;如何做好信息收集和漏洞探针也是获取攻击者思路的重要操作&#xff0c; 除去本身漏洞外&#xff0c;提前预知或口令相关攻击也要进行筛选。排除三方应用攻击行为&#xff0c;自查漏洞分析攻击者思路&a…