Linux基础之makefile/make

news2024/9/23 11:13:04

目录

一、背景

 二、makefile和make的讲解

2.1 使用方法

2.2 伪目标文件

2.3 文件的属性以及属性的更新

2.4 makefile的自动推导


一、背景

这里会提及为什么要使用makefile和make,以及他们是什么和作用。

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

简单来说:

makefile 是一个在当前目录下存在的一个具有特定格式的文本文件

make是一条指令

 二、makefile和make的讲解

2.1 使用方法

       既然makefile和make是这么好的一个工具,那我们该如何去使用他呢。莫急,且听我与你细细道来。首先在上文我们就说了,makefile是一个文件,那我们就得创建一个文件,且其命名必须为makefile(首字母可以大写)。例如我编写的这个:

        文件创建好了,那么其内容我们该怎么去编写呢,先看例子:

       这里先简单的说明一下这段代码是什么意思,随着我之后的讲解你们会逐渐地理解。 
       首先第一行代码,表明mybin和code.c具有依赖关系呢,这个大家慢慢就可以理解,其中 :左边的文件主要依赖于右边的文件,:右边可以有多个文件(先简单这样理解)。
       第二行代码,表面第一行依赖关系的依赖方法,通过这行代码我们也可以看出通过gcc指令将code.c编译生成mybin文件。
       第三行代码,表示clean是一个伪目标,这个下文我们会具体的说明。
       第四行代码,表示clean没有具体的依赖文件。
       第五行代码,同样表示其依赖方法,这里主要是删除mybin这个可执行文件。
接下来,让我们看看效果:
 
       可以发现,我们仅仅通过make指令就形成了我们的可执行文件,同样我们还通过make clean指令删除了我们的mybin文件。
       我相信细心的同学肯定会发现,为什么我们生成mybin文件的时候不需要写成make mybin呢?
这是因为当我们输入make指令时,其会自动在Makefile文件中从上自下的去检索第一个有效指令。如果我们把clean和mybin换一下位置,结果可就不一样了哦,大家可以自行尝试一下。

       我们其实还可以用其他方式来编写我们的makefile,这里我直接给大家上代码,再根据代码进行介绍。

      在编写makefile时,我们可以像前三行一样,去给我们的文件重新起一个名字,使用格式为 
$(+命名名字)。
      在看第一个关联关系,出现一个 $^ 和一个 $@ ,那这两个符号是什么意思呢。

$^ :表示关联关系的右边 即 :的右边

$@:表示关联关系的左边 即 :的左边

2.2 伪目标文件

在刚刚的代码中我们看到了这样一段代码:

首先将结论:

.PHONY 将clean修饰成了一个伪目标

那么这个伪目标有什么作用呢

作用:当被修饰成伪目标后,该指令可以总是被执行(依赖方法总是被执行的,不会被任何方式所拦截)

为什么要说可以总是被执行呢,难道系统还会拦截我们的指令不成,事实上确实时会的。例如:

       可以发现我们的make mybin在执行一次之后就不在让我们去执行了,而make clean 却可以反复的去执行。那这是为什么呢,系统是如何去拦截我们的命令的呢?,请看下文。

2.3 文件的属性以及属性的更新

首先我们来介绍一个指令:

stat + 文件名 ------------------可以查看一个文件的属性

例如我们现在就来看看刚刚通过make指令创建的code.c文件:

我们可以看到在文件中有很多属性,这里我们具体来说是后面三个。

Access : 访问时间。

Modify:最近一次文件内容被修改的时间

Change:最近一次文件属性被修改的时间
注意:文件 = 内容 + 属性

回归正题,为什么make/makefile总是不让我们重新编译代码?

       其实这是为了去提高我们的编译效率。如果我们的源代码什么都没改,那么我们一直的反复编译时没有任何意义的,所以其总是不让我们重新编译代码。

那么其是怎么做到这一点的呢?

       主要通过一个文件的修改时间,光一个时间有什么用呢。所以时间并不是本质,通过时间对比出文件的新旧才是本质(更新后的文件才有重新编译的价值)。那么其和谁去对比呢?不要忘了,我们生成的可执行程序也是一个文件,要知道重新编译的本质不就是重新写入一个二进制可执行文件吗,那么其的修改时间就一定会更改。
        这里还有一个逻辑,第一次编译的时候,一定是先有的源文件,才有的bin文件,那么
源文件的修改时间一定会小于bin文件的修改时间。那么在之后,我们对源文件做修改的时候一定有,源文件的修改时间大于bin文件的修改时间(此时还没进行编译)。这样不就可以对比出文件的新旧,进而去达到防止我们对一个文件反复编译的效果了吗。

       这里重新介绍一下touch,其还可以更新一个文件的时间。可以用man指令进行查看。(我这只截取了一部分)

可以看到 -a是修改访问时间,-m是修改mtime。

       我们在这里可以通过这个指令来印证上面我们所说的。
这个时候是不让make的:

其时间属性如下:

接着我们touch一下,然后再次观察code.c的时间属性:

可以很明显的发现其发生了变化,我们在试一试可不可以make:

实验成功,刚好印证了我们上面所说。

补充:

       我们所看到的文件,一般在哪里存放着呢?一般是放在磁盘,更改文件时间的本质其实就是访问磁盘。其实系统不是很愿意去访问外设的,因为很慢,会导致效率的降低。但是一般而言,一个文件被查看的频率是非常高的(不是用户访问),如果每次都要去更改Access的话,会导致Linux系统充满大量的访问磁盘的IO操作,变相的减慢系统效率。为了减少这样的访问,系统设置了一个每经过一定次数的查看,再进行一次修改Access的操作。

2.4 makefile的自动推导

这里我们同样先用代码举例:

       这段代码很有意思,当我们要创建mybin时,目录中却没有code.o,怎么办,那么他就会在makefile中从上至下的去找,看有没有关于code.o的依赖关系,很明显根据这段代码他一直会往下找,直到遇到code.c(该文件在目录中存在),这往下找的过程其实可以看做时一个入栈的过程,而当找到code.c,那么接下来就会相当于一个出栈的过程一直生成所要的文件。
        这部分过程可以看做makefile/make的推导能力(当然这只是很小的一部分)。

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

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

相关文章

JS基础:输出信息的5种方式详解

你好,我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。 云桃桃-大专生,一枚程序媛,感谢关注。回复 “前端基础题”,可免费获得前端基础 100 题汇总,回复 “前端基础路线”,可获取完整web基础…

基于LLama3、Langchain,Chroma 构建RAG

概要: 使用Llama3 Langchain和ChromaDB创建一个检索增强生成(RAG)系统。这将允许我们询问有关我们的文档(未包含在训练数据中)的问题,而无需对大型语言模型(LLM)进行微调。在使用RA…

【企业动态】东胜物联正式加入EnOcean联盟,携手为智慧楼宇及能源管理提供更稳定的硬件解决方案

2024年4月,东胜物联(Dusun)宣布正式加入EnOcean联盟。EnOcean联盟是一个由来自建筑行业的400多家公司组成的全球性组织。它以EnOcean无线标准(ISO/IEC 14543-3-10/11)为基础,为可持续建筑自动化建立了创新的…

短剧APP开发:百亿短剧市场规模下的收益密码

短剧进入到大众的视野中,成为影视新行业,成为了中老年人茶余饭后的休闲方式,也成为了年轻人的“电子榨菜”。短剧时长短、节奏快,观众可以在短时间内看完一部剧,波澜起伏的剧情能够推动短剧的剧情,吸引观众…

【MRI重建】基于L+S方法的加速动态成像(MATLAB)

关于 L+S 模型很自然地可以表示动态 MRI 数据。重建欠采样数据需要 k−t 空间(采集)与 L 的奇异向量和 S 的稀疏域之间的不相干性。 L 和 S 之间的不相干性是背景和动态分量稳健分离所必需的。多线圈 L+S 重建是使用凸优化方法制定的,其中核范数用于强制 L 中的低秩,而 l1 …

58行代码把Llama 3扩展到100万上下文,任何微调版都适用 | 最新快讯

量子位公众号 QbitAI 堂堂开源之王 Llama 3,原版上下文窗口居然只有……8k,让到嘴边的一句“真香”又咽回去了。 在 32k 起步,100k 寻常的今天,这是故意要给开源社区留做贡献的空间吗? 开源社区当然不会放过这个机会&a…

[JUCE库]关于JUCE如何生成动态链接库 juce-7.0.1-windows

前言 当我们在使用JUCE库的时候,可能会需要使用到静态链接的方式,还好的一点是JUCE本身提供了CMake编译,也提供了单独的sln编译。 本文章仅针对juce-7.0.1-windows,由于不同版本之间差异较大,可能不能通用&#xff0…

Codeforces Round 943 (Div. 3) A~E

A. Maximize? Problem - A - Codeforces 给定x求出使这个式子最大的y&#xff1a; 不用想复杂直接循环枚举即可。 #include<bits/stdc.h> using lllong long; ll n,m; void solve() {int x;std::cin>>x;ll ans0,y;for(int i1;i<x;i){if(std::__gcd(i,x)i>a…

鸿蒙内核源码分析(信号量篇) | 谁在负责解决任务的同步

基本概念 信号量&#xff08;Semaphore&#xff09; 是一种实现任务间通信的机制&#xff0c;可以实现任务间同步或共享资源的互斥访问。 一个信号量的数据结构中&#xff0c;通常有一个计数值&#xff0c;用于对有效资源数的计数&#xff0c;表示剩下的可被使用的共享资源数…

linux 调试-kdb 调试内核-1

目标&#xff1a;打印bcm2835_spi_transfer_one 是如何从用户空间开始调用的 1. kernel 配置 KDB配置选项 添加 spi 控制器驱动 和 spi 设备驱动 2. 调试流程 调试内核-系统启动之后 1. 开发板进入kdb,等待pc 连接 rootraspberrypi:~# echo "ttyS0,115200"…

抖音小店如何快速出单?内行人闭口不提的诀窍,一篇全曝光!

哈喽~我是电商月月 新手做抖店不成功&#xff0c;最大的问题就是不懂技巧&#xff0c;不懂规则&#xff0c;不懂玩法&#xff0c;你基础事项&#xff0c;思维方向都没选好&#xff0c;再怎么努力也别想出单 看下去&#xff0c;新手在开店后不要着急选品&#xff0c;先把这些问…

数据结构复习指导之树的基本概念

文章目录 树与二叉树 考纲内容 复习提示 前言 1.树的基本概念 1.1树的定义 1.2基本术语 1.3树的性质 树与二叉树 考纲内容 &#xff08;一&#xff09;树的基本概念 &#xff08;二&#xff09;二叉树 二叉树的定义及其主要特征&#xff1b;二叉树的顺序存…

22 Debian如何配置Apache2(2)虚拟主机

作者&#xff1a;网络傅老师 特别提示&#xff1a;未经作者允许&#xff0c;不得转载任何内容。违者必究&#xff01; Debian如何配置Apache2&#xff08;2&#xff09;虚拟主机 《傅老师Debian小知识库系列之22》——原创 前言 傅老师Debian小知识库特点&#xff1a; 1、最…

文件加密软件排行榜前四名(2024年4大好用的加密软件推荐)

说到文件加密&#xff0c;想必大家都很熟悉&#xff0c;文件加密已经普遍应用&#xff0c;文件加密是一种重要的安全措施&#xff0c;可以确保数据的机密性、完整性和可用性&#xff0c;降低因数据泄露或丢失带来的风险 。 下面小编给大家分享几款常用的加密软件&#xff0c;…

【redis】Redis数据类型(五)ZSet类型

目录 类型介绍特点补充 使用场景 Zset类型数据结构ziplist&#xff1a;压缩列表&#xff08;参考之前的文章&#xff09;skiplist&#xff1a;跳表解析 面试题&#xff1a;MySQL索引为什么用B树而不用跳表区别总结 常用命令ZADD示例 ZREM示例 ZCARD示例 ZCOUNT示例 ZSCORE示例 …

spring高级篇(九)

boot的执行流程分为构造SpringApplication对象、调用run方法两部分 1、Spring Boot 执行流程-构造 通常我们会在SpringBoot的主启动类中写以下的代码&#xff1a; 参数一是当前类的字节码&#xff0c;参数二是main的args参数。 public class StartApplication {public static…

【微信小程序开发】微信小程序注册,配置开发者工具

准备工作 微信小程序小程序开发流程 开发过程注册小程序开发者工具开发界面介绍 微信小程序 一种新的开发能力&#xff0c;可以在微信内被便捷的获取和传播&#xff0c;具有出色的用户体验 地址&#xff1a;https://mp.weixin.qq.com/ 注册微信小程序 在进行开发之前我们应该…

从开发角度理解漏洞成因(02)

文章目录 文件上传类需求文件上传漏洞 文件下载类需求文件下载漏洞 扩展 留言板类&#xff08;XSS漏洞&#xff09;需求XSS漏洞 登录类需求cookie伪造漏洞万能密码登录 持续更新中… 文章中代码资源已上传资源&#xff0c;如需要打包好的请点击PHP开发漏洞环境&#xff08;SQL注…

如何使用高德地图的 Loca 展示 gpx 文件的 3D 路径,Loca.LineLayer

如何使用高德地图的 Loca 展示 gpx 文件的 3D 路径&#xff0c;Loca.LineLayer 找寻了好久&#xff0c;终于将这个展示 3D 路径的功能实现了。 在线实例&#xff1a; http://kylebing.cn/tools/map/#/gpx/gpx-viewer-3d 这里是用于展示 gpx 路径&#xff0c;关于 gpx 的相关知…

Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg

本文首发于公众号&#xff1a;机器感知 Voice Conversion、DreamScene、X-SLAM、Panoptic-SLAM、DiffMap、TinySeg Converting Anyones Voice: End-to-End Expressive Voice Conversion with a Conditional Diffusion Model Expressive voice conversion (VC) conducts speak…