Linux·权限与工具-make
1. Makefile/makefile工具
首先展示一下,makefile工具如何使用。我们先写一个C语言程序

然后我们建立一个Makefile/makefile文件,m大小写均可。我们在文件中写入这样两行

wq保存退出后,我们使用 make 命令
可以看到生成了可执行程序,其效果就是我们刚才写的打印出 hello world
这就是makefile的作用,一个工程中的源文件不计其数,其按类型、功能、模块分放在若干给文件当中,而makefile定义了一系列的规则来指定,哪些文件需要先编译,那些文件需要后编译,和其他一些操作。它是一个“自动化编译”的效果,一旦写好makefile文件,我们就无需自己手动一个一个的敲编译命令,至于要一个make就可以使整个工程完全自动编译起来。
1.1 make语法
下面我们就来拆解一下makefile文件的语法。

第一行冒号前的部分我们叫目标文件,可以通过make调用目标文件来达到执行下面依赖方法的效果。
冒号后面的部分我们叫依赖文件列表,这个列表中可以放多个依赖文件,用于提供给下面的依赖方法使用,就是说依赖方法要依赖这个列表中的文件去执行某些操作。
第二行我们写依赖方法,依赖方法必须以tab开头。
目标文件和依赖文件列表的集合称为依赖关系,makefile本质是依赖关系和依赖方法的集合。
事实上,makefile文件的作用是执行事先使用依赖方法写好的一些命令:


可以看到 make+目标文件 就可以很好的完成我们预设定好的命令,但是它在执行命令的时候都会把命令打印一边,如果不想看见打印命令的话,可以在命令前加上@符号就可以


这里可以发现我在执行第一行编译的时候并没有加上目标文件,但是在执行第四行和第九行的时候都加上了目标文件。
这是因为makefile文件,会被make从上到下扫描,第一个目标名,是对于make来说属于可以缺省形成的,也就是说如果make后面什么都不跟,就默认执行第一个目标文件。也就是说,谁放在最开头,谁就可以直接make执行不需要加目标文件名。
1.2 make特性
1.2.1 执行中断
我们进入代码文件中,故意写出点语法错误,这样编译的话就会导致报错,然后我们再对makefile文件也稍加修改,让它在编译完成之后打印点东西出来


make执行一下编译命令。

可以看到,在编译报错之后直接跳出了makefile文件,执行被中断 aaa 并没有被打印出来。
1.2.2 更新编译 与 stat命令
ps:其实这个更新编译的特性属于make指令和gcc编译指令结合后出现的特性,单独使用gcc编译指令是不会出现这一特性的。
其实我前面写的makefile文件是有问题的,在编译的依赖方法中,实际上是hello文件在依赖hello.c文件,但是我在目标文件中声明的文件却是proc文件作为目标文件在依赖helloc.c文件。如果按我上面这种错误的语法写makefile的话是不会出现更新编译的特性的。
因此我们先把makefile文件改成正确的语法
我们clean清理一下,然后make多次,看看现象。

可以看到只成功make了一次,之后再make就表示hello已经是最新了,不再编译。
这拒绝编译的反应是符合道理的,因为如果一个文件已经是最新了就没必要再重复编译,如果一个文件很大,那重复编译的行为就会浪费掉大量的时间成本。
其拒绝编译的逻辑就是对比目标文件和依赖文件的更新时间,如果依赖文件的更新时间更早说明目前的目标文件是最新状态,如果依赖文件更新时间更晚,说明hello.c文件已经被更改过了,目标文件也就需要重新编译了。
这个文件的属性我们可以用 stat 命令来查看。

其中时间属性就是我圈出来的这三个时间,第一个Access我们称为Atime表示最近文件被访问的时间,它比较没用,更新编译也不看这个时间。它这里面的机制比较奇怪不是说访问一次就一定会记录下来,而是访问到了一定次数才会记录一次,主要是为了防止操作系统要频繁的修改文件的访问时间属性。
第二个Modify我们称为Mtime表示文件内容最近被修改的时间,第三个Change我们称为Ctime表示文件属性最近被修改的时间。
修改文件内容可能会牵连到文件属性的修改,比如文件的大小。
更新编译的逻辑就是根据Mtime进行对比的,如果.c文件修改时间早于目标文件,说明目标文件已经是最新的了,无需编译;如果.c文件修改时间晚于目标文件,说明.c文件被更新过了,目标文件也需编译更新。
1.2.3 .PHONY 设置伪目标
如果我们想让这个编译指令忽略掉更新限制,我们可以选择将设置伪目标,语法如下

这个语法的意思就是将hello文件变成了一个伪目标,也就是说告诉makefile hello 是一个不存在的文件,此时makefile就不会去特意对比hello和hello.c文件的更新时间,而是直接执行gcc编译指令了。
这个语法就和我一开始所写的proc目标文件错误有异曲同工之处,它们都是不存在的伪目标,只不过一种是刻意用 .PHONY 指定出来的,一种是真的不存在。
可以验证一下,将hello设置成伪目标之后是不是可以忽略最新编译限制去make了

也可以将目标文件搞成proc一个真正不存在的目标试试,也是同样的效果。
1.2.4 入栈执行
我们可以在makefile文件中如下写法,将上节中编译的整个过程写出来

然后我们保存退出,试试这样make的效果

我们可以通过这里看出,当makefile发现目录的明面上没有hello.o文件,那它就会将依赖方法入栈,然后直到找到出口回归,将栈中所有依赖方法执行。
1.2 make进阶语法
1.2.1 %通配符
我们在实际使用的时候不会像上面那样把一个文件的编译过程弄的那么复杂,而是会面临一次性想要编译多个文件的需求。

处理这样的问题可以是使用makefile中类似通配符的东西 %

由makefile自己推导所需的.c文件,将它们一个一个的交给gcc -c指令,并生成对应的.o文件,其效果我们可以make看一下

1.2.2 =变量定义
makefile中还可以定义和使用变量,用作设定文件名。

定义时等号左右不能有空格,使用变量时用 $(变量) 将变量包起来,这样makefile文件就会将定义好的内容替换到下面的各个位置。
1.2.3 $符号的使用
我们前面说过 $< 的含义是将依赖列表中的文件一个一个的交给指令。
下面还有 $^ $@ 两个指令

其中 $^ 的含义就是将依赖列表中的所有文件一次性交给指令, $@ 的含义是将 : 左侧也就是想要形成的目标文件。
这种操作就像是在宏替换一样。这样写完后我们就可以通过一份 hello.c 文件生成多个任意名称的文件,只需要修改bin设定的值即可。
1.2.4 一次性形成多个可执行程序
现在我们想要一次性把 hello.c hello1.c 都形成可执行程序改怎么做

事实上我们可以使用伪目标的依赖列表来巧妙的完成这一需求


相关文章:
Linux·权限与工具-make
1. Makefile/makefile工具 首先展示一下,makefile工具如何使用。我们先写一个C语言程序 然后我们建立一个Makefile/makefile文件,m大小写均可。我们在文件中写入这样两行 wq保存退出后,我们使用 make 命令 可以看到生成了可执行程序ÿ…...
C++的序列容器——数组
前言: 这篇文章我们就开始新的章节,我们之前说的C/C的缺陷那部分内容就结束了。在开始新的章之前我希望大家可以先对着题目思考一下,C的容器是什么?有什么作用?下面让我们开始新的内容: 目录 前言&#x…...
TCC 和 XA 协议之间的区别?
TCC(Two-Phase Commit)协议和XA协议都是用于分布式系统中确保事务原子性的协议。它们在实现分布式事务协调方面有一些相似之处,但也存在一些关键的不同点。 协议的协调者(Coordinator)角色: TCC协议&#x…...
萌啦数据插件使用情况分析,萌啦数据插件下载
在当今数字化时代,数据已成为企业决策与个人分析不可或缺的重要资源。随着数据分析工具的日益丰富,一款高效、易用的数据插件成为了众多用户的心头好。其中,“萌啦数据插件”凭借其独特的优势,在众多竞品中脱颖而出,成…...
C++初学(13)
13.1、for循环的组成部分 for循环的组成部分完成下面这些步骤: (1)设置初始值。 (2)执行测试,看看循环是否应当继续。 (3)执行循环操作。 (4)更新用于测试的值。 C循环设计中包含这要素,很容易识别,初始化、测试和更新操作工…...
目标检测之数据增强
一、概述 数据增强是一种通过人工或自动方式对数据进行修改或变换,以增加数据集规模和多样性的技术。在机器学习中,数据增强被广泛应用于解决数据稀缺、数据不平衡、数据噪声等问题,提高模型的泛化能力和鲁棒性。 二、为什么需要数据增强 …...
本地下载安装WampServer结合内网穿透配置公网地址远程访问详细教程
文章目录 前言1.WampServer下载安装2.WampServer启动3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 Wamp 是一个 Windows系统下的 Apache PHP Mysql 集成安装环境,是一组常用来…...
一篇文章理清Java持久化脉络(关于JDBC、JPA、Hibernate、Spring Data JPA)
Java持久化 一、JDBC、JPA、Spring Data JPA 的定义及关系二、JDBC(古老的东西,只需简单知道是啥)1.1 JDBC概念1.2 JDBC示例 三、JPA(第二代持久化,代表是Hibernate等框架)3.1 JPA概念3.2 JPA示例 四、Spri…...
【数学分析笔记】第2章第1节实数系的连续性(1)
2. 数列极限 2.1 实数系的连续性 人类对数系认识的历史: 人类最早对数系的认识是自然数集合 N \mathbb{N} N,自然数系对加法和乘法是封闭的(这里的封闭是指:若 m ∈ N , n ∈ N ⇒ m n ∈ N , m n ∈ N m\in\mathbb{N},n\in\ma…...
Speech Synthesis (LASC11062)
大纲 Module 1 – introductionModule 2 - unit selectionModule 3 - unit selection target cost functionsModule 4 - the databaseModule 5 - evaluationModule 6 - speech signal analysis & modellingModule 7 - Statistical Parametric Speech Synthesis (SPSS)Modu…...
拟合与插值|线性最小二乘拟合|非线性最小二乘拟合|一维插值|二维插值
挖掘数据背后的规律是数学建模的重要任务,拟合与插值是常用的分析方法 掌握拟合与插值的基本概念和方法熟悉Matlab相关程序实现能够从数据中挖掘数学规律 拟合问题的基本提法 拟合问题的概念 已知一组数据(以二维为例),即平面上n个点 ( x i , y i ) …...
《python语言程序设计》2018版第7章第05题几何:正n边形,一个正n边形的边都有同样的长度。角度同样 设计RegularPolygon类
结果和代码 这里只涉及一个办法 方法部分 def main():rX, rY eval(input("Enter regular polygon x and y axis:"))regular_num eval(input("Enter regular number: "))side_long eval(input("Enter side number: "))a exCode07.RegularPol…...
使用Virtio Driver实现一个计算阶乘的小程序——QEMU平台
目录 一、概述 二、代码部分 1、Virtio 前端 (1) User Space (2) Kernel Space 2、Virtio 后端 三、运行 QEMU Version:qemu-7.2.0 Linux Version:linux-5.4.239 一、概述 本篇文章的主要内容是使用Virtio前后端数据传输的机制实现一个计算阶乘的…...
【PyCharm】配置“清华镜像”地址
文章目录 前言一、清华镜像是什么?二、pip是什么?三、具体步骤1.复制镜像地址2.打开PyCharm,然后点击下图红框的选项3.在弹出的新窗口点击下图红框的选项进行添加4.在URL输入框中粘贴第一步复制的地址,名字可以不更改,…...
IO器件性能评估
整体逻辑:需要先了解到读写速率的差异,在明确使用场景。比如应用启动过程中的IO主要是属于随机读的io 评估逻辑: UFS 与 eMMC主要差别在io读写能力: 1,对比UFS、eMMC的规格书标注的io读写能力 ufs spec : sequentia…...
在js中判断对象是空对象的几种方法
使用 Object.keys() 方法 Object.keys() 方法返回对象自身的可枚举属性名称组成的数组。如果数组的长度为 0,那么对象是空的。 function isEmptyObject(obj) {return Object.keys(obj).length 0 && obj.constructor Object; }const obj1 {}; const obj2…...
【整理】后端接口设计和优化相关思路汇总
文章目录 明确的接口定义和文档化使用RESTful设计规范分页和过滤合理使用缓存限流与熔断机制安全性设计异步处理与后台任务接口参数校验(入参和出参)接口扩展性考虑核心接口,线程池隔离关键接口,日志打印接口功能单一性原则接口查…...
docker 部署 sql server
众所周知,sql server不好装,本人之前装了两次,这个数据库简直是恶心。 突然想到,用docker容器吧 果然可以 记得放开1433端口 还有 记得docker加速,不然拉不到镜像的最后工具还是要装的,这个就自己研究吧。 …...
微信云开发云存储 下载全部文件
一、安装 首先按照这个按照好依赖,打开cmd 安装 | 云开发 CloudBase - 一站式后端云服务 npm i -g cloudbase/cli 安装可能遇到的问题 ‘tcb‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。-CSDN博客 二、登录 在cmd输入 tcb login 三、…...
1、巡线功能实现(7路数字循迹)
一、小车运行 1.PWM初始化函数 (pwm.c中编写) 包括四个轮子PWM通道使用的GPIO接口初始化、定时器初始化、PWM通道初始化。 void PWM_Init(uint16_t arr,uint16_t psc); 2.PWM占空比设置函数 (pwm.c中编写) 此函数调用了四个通道设置占空比的函数,作用是方便修改四…...
光流法在气象雷达中的应用:从原理到外推实践
光流法在气象雷达中的应用:从原理到外推实践 气象雷达作为现代气象监测的核心工具,其回波数据蕴含着丰富的天气系统动态信息。如何从这些看似静态的图像序列中提取运动规律,进而预测未来短时内的天气变化,一直是气象学界和工程界关…...
Z-Image Turbo实际作品分享:城市风光生成效果
Z-Image Turbo实际作品分享:城市风光生成效果 本文所有内容均为技术效果展示,不涉及任何政治敏感内容,所有案例均为技术演示用途。 1. 效果概览:城市风光的AI艺术呈现 Z-Image Turbo作为基于Gradio和Diffusers构建的高性能AI绘图…...
基于GOOSE - Transformer - LSTM的数据回归预测探索
基于GOOSE-Transformer-LSTM的数据回归预测 模型结合Transformer的全局注意力机制和LSTM的短期记忆及序列处理能力 首先,采用Transformer自注意力机制捕捉数据的全局依赖性,并输出一个经过全局上下文编码的表示;然后,采用2024年最…...
SDMatte部署避坑指南:首次加载延迟、模型切换等待、端口冲突解决方案
SDMatte部署避坑指南:首次加载延迟、模型切换等待、端口冲突解决方案 1. 为什么选择SDMatte进行图像抠图 SDMatte是一款专为高质量图像抠图设计的AI模型,特别适合处理那些传统抠图工具难以应对的复杂场景。想象一下,你需要把玻璃杯从背景中…...
三极管信号滤波原理与工程实践
1. 三极管在信号滤波中的独特应用作为一名嵌入式硬件工程师,我经常需要处理各种传感器信号。最近在无刷电机驱动项目中,遇到了霍尔信号毛刺干扰的问题。传统教科书上总是强调三极管的放大作用,但实际工程中,我发现三极管在信号滤波…...
JS 缓存函数(缓存函数计算结果、缓存异步函数的执行结果以及带过期时间)
JS 缓存函数 一、普通函数结果缓存(同步缓存) 实现一个通用缓存高阶函数,核心逻辑:第一次执行计算并缓存结果,后续相同参数直接读取缓存,不再重复执行。 实现代码 // 缓存高阶函数:接收一个函数…...
OpenClaw如何实现数据可视化
要实现数据可视化,OpenClaw 主要通过以下几种方式,您可以根据需求选择合适的方法: 📊 1. 使用内置的 visualizerAgent OpenClaw 内置了 agent:visualizer,可直接从 CSV 等文件生成交互式 HTML 仪表盘(如折…...
BilibiliDown:B站视频下载的完整解决方案
BilibiliDown:B站视频下载的完整解决方案 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/BilibiliDo…...
手把手教你从Docker中提取Milvus二进制文件并配置集群环境
深度解析:从Docker镜像提取Milvus二进制文件的完整实践指南 在向量数据库领域,Milvus凭借其出色的性能和可扩展性已经成为众多AI应用的首选基础设施。虽然官方推荐使用Docker进行部署,但在生产环境中,直接使用二进制文件部署往往…...
万象视界灵坛代码实例:使用Gradio快速搭建像素风Web UI,零前端开发经验可用
万象视界灵坛代码实例:使用Gradio快速搭建像素风Web UI,零前端开发经验可用 1. 项目概述 万象视界灵坛是一款基于OpenAI CLIP模型的多模态智能感知平台,它将复杂的语义对齐功能包装在充满游戏感的像素风界面中。这个项目最大的特点是完全不…...
