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中编写) 此函数调用了四个通道设置占空比的函数,作用是方便修改四…...

XCTF-web-easyupload
试了试php,php7,pht,phtml等,都没有用 尝试.user.ini 抓包修改将.user.ini修改为jpg图片 在上传一个123.jpg 用蚁剑连接,得到flag...

stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...

.Net框架,除了EF还有很多很多......
文章目录 1. 引言2. Dapper2.1 概述与设计原理2.2 核心功能与代码示例基本查询多映射查询存储过程调用 2.3 性能优化原理2.4 适用场景 3. NHibernate3.1 概述与架构设计3.2 映射配置示例Fluent映射XML映射 3.3 查询示例HQL查询Criteria APILINQ提供程序 3.4 高级特性3.5 适用场…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

YSYX学习记录(八)
C语言,练习0: 先创建一个文件夹,我用的是物理机: 安装build-essential 练习1: 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件,随机修改或删除一部分,之后…...

dify打造数据可视化图表
一、概述 在日常工作和学习中,我们经常需要和数据打交道。无论是分析报告、项目展示,还是简单的数据洞察,一个清晰直观的图表,往往能胜过千言万语。 一款能让数据可视化变得超级简单的 MCP Server,由蚂蚁集团 AntV 团队…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...

【JVM面试篇】高频八股汇总——类加载和类加载器
目录 1. 讲一下类加载过程? 2. Java创建对象的过程? 3. 对象的生命周期? 4. 类加载器有哪些? 5. 双亲委派模型的作用(好处)? 6. 讲一下类的加载和双亲委派原则? 7. 双亲委派模…...