当前位置: 首页 > news >正文

linux自动化构建工具--make/makefile

目录

1.make/makefile介绍

1.1基本认识

1.2依赖关系、依赖方法

1.3具体操作步骤

1.4进一步理解

1.5默认设置

1.6make二次使用的解释

1.7两个文件的时间问题

1.8总是被执行

1.9特殊符号介绍


1.make/makefile介绍

1.1基本认识

make是一个指令,makefile是一个文件(Makefile也是一样的,两个实际上就是一个东西,M大小写都没有影响),这个是我们首先应该意识到的问题;

1.2依赖关系、依赖方法

为什么会有这个自动化构建工具,就是我们自己创建一个文件,在这个文件里面写入相关的内容之后,这个时候我们需要使用gcc或者是g++工具进行相关的编译,我们如果要对于这个文件进行修改之后,就需要重新进行编译,这个时候还是需要输入这个指令gcc -o 目标文件  源文件,如果每一次进行修改,这个编译的指令很麻烦,这个时候我们就可以使用这个自动化构建工具,运用依赖关系和依赖方法解决这个问题;

1.3具体操作步骤

创建一个test.c文件,并在里面写入相关的内容,可以使用vim运用不同的模式之间的相互切换实现这个内容的写入;然后创建一个makefile文件,这个里面就是依赖关系和依赖方法的内容;

这个test:test.c就是依赖关系,怎么理解呢,这个test文件就是test.c文件编译之后的文件结果,第二行就是依赖方法,实际上就是进行编译的指令;

clean就是一个文件创建之后的清理的命令,我们使用的就是这个rm -f test清除这个生成的编译文件;

上述的这个makefile问价创建完成之后,test.c文件写入之后,这个时候,我们直接使用这个make指令,这个时候就显示出来我们的makefile文件里面的第一个指令,就是这个编译test.c文件的指令,这样的话,我们就可以直接使用这个make对于我们指定的文件进行编译处理,而不需要重复的输入指令,但是这个确定就是我们只能使用一次这个make指令,当我们再次进行使用这个指令的时候,系统就会提示我们这个test up to date,这个意思是说这个test文件(编译之后的文件)已经保存在了相关的目录里面,除非我们对于这个test.c的内容进行修改,这个时候我们才可以重新编译,重新使用这个make指令,因为这个重新编译之后的内容发生了更新和变化;

我们输入make clean指令,就可以实现对于这个生成的编译文件的清除;

1.4进一步理解

源文件到可执行文件,我们可以把这个过程写复杂一些,把这个中间文件的生成过程也显示出来,然后重新进行编译,分析依赖关系,依赖方法;

这个里面的过程稍微复杂一些,test文件依赖于这个test.o文件,test.o又依赖于test.s文件,test.s文件又依赖于test.i文件,test.i文件又依赖于test.c文件,这个过程很类似于我们之前学过的这个递归的过程(这个只是为了说明问题,我们的这个实际操作的时候直接按照上面的简便写法就可以了);

这个例子只是为了说明多层依赖关系在执行的时候,这个顺序的问题,我们使用这个make指令的时候,就会发现这个顺序和我们写入到makefile文件里面的顺序恰好是相反的,我们可以类比这个递归的归的过程,归的时候后调用的函数会限制性,这个里面因为依赖关系,后出现的指令会先被执行,因为这个里面最先被需要的就是这个test.i文件,他是直接有这个test.c文件得到的,按照这个顺序才可以实现这个编译的过程;

实际上我们上面输入的时候是4组指令,每一组都是有这个依赖关系和依赖方法,我们把这个4组的顺序随意更换,这个输出的结果是不变的,是可以正常运行的,因此我们可以知道这个make会自动推导这个makefile文件里面的依赖关系,所以这个和顺序没有关系;

但是一旦我们缺少任意一个中间环节,这个过程都是没有办法正常运行的,因为他们之间是相互依赖的;

1.5默认设置

make会自顶向下访问这个命令,我们在这个makefile文件里面添加新的内容,就是这个文件的清理,什么叫做默认设置呢?就是这个make指令的时候,就会默认执行前面的这个文件编译的中间过程。我们要想要清理这个文件就需要make clean指令,这个就是因为在默认的make指令作用下,我们会先执行上面文件指令,如果我们把这个清理的指令放到gcc的上面,这个时候就会优先执行清理的命令;

但是我们一般不会把这个文件的清理放到前面,因为我们还需要对于这个相关的文件进行操作,删除清理就没有办法操作了;

1.6make二次使用的解释

我们第一次编译之后使用make就会执行相关的操作,但是第二次甚至更多次使用这个make就无法有效发挥作用,这个一个原因是为了提高我们的编译效率;

怎么做到的:源文件编译成可执行文件,源文件最近被修改的时间早于可执行文件,我们对于这个原文件修改之后(没有编译),这个新文件比可执行程序要更新,这个时候就可以直接使用make指令(这个时候回重新编译);

这个也是为什么我们的文件编译一次之后只能make一次,但是修改之后就可以再次使用这个make指令了的原因;

1.7两个文件的时间问题

我们上面介绍这个源文件和可执行文件的时间的早晚问题以确定这个make指令能否有效使用,在linux里面,我们可以使用这个stat指令查看相关的时间;

stat test.c就是显示这个源文件的相关的时间,stat test指令就是显示这个生成编译之后的可执行文件的相关的时间,stat指令就是查看时间的,这个指令后面可以跟上这个文件名字;

显示的内容都是一样的,只不过这个对应的选项的具体的数值会有所区别:

这个下面显示了这个文件的相关的信息,access就是访问这个文件的最新时间(访问就比较宽泛,我们使用cat查看相关的文件内容也是访问,修改文件内容也是访问,打开这个文件也是访问等等),modify是修改的时间,change 也是相当于改变,两个很相似,有什么区别呢?简称ACM

之前我们介绍权限的时候说过这个文件==文件内容+文件的属性,这个modify是相当于改变这个文件的内容,只对于文件的属性进行修改,我们称之为change,所以我们对于文件操作的时候,可能修改文件的内容和属性,内容就是modify ,属性就是change;

但是这三个时间不是割裂的,我们对于这个文件内容改变了,modify时间肯定变,但是这个文件内容改变会引起这个文件的大小改变,这个change时间也会改变,我们想要修改内容肯定要打开这个文件,这个时候access时间也会改变,因此这三个时间并不是没有任何联系;

1.8总是被执行

我们上面介绍的这个时间,实际上就是判断源文件和目标文件的生成时间判断这个make是否会被执行,如果我们想要这个make指令输入之后这个一定被执行,可以在这个第一行前面添加.PHONY:文件名字;

上面的就是这个文件makefile里面应该输入的内容,我们使用make之后,就会发现这个一定会被执行,但是我们一般不会这样搞,我们可以把这个总是被执行的设置放到clean那一行,这样的话我们的这个清除就可以总是被执行(默认实际上也是可以会被多次执行的),但是并不一定这个里面只有文件清理的其他的指令,这个并不是多此一举哈,书写格式如下所示:

1.9特殊符号介绍

我们在这个里面使用gcc进行编译的时候,这个$@可以表示这个依赖关系前面的文件,$^可以表示这个依赖关系后面的文件,我们可以使用这个符号代替里面涉及到的两个文件;

但是实际上在查看文件内容的时候这个特殊符号会以这个文件名字的形式回显出来的;

我们在这个指令前面添加上一个@符号,就可以让这个make之后的结果不会显示在屏幕上面,这个就是一个隐藏的功能;

相关文章:

linux自动化构建工具--make/makefile

目录 1.make/makefile介绍 1.1基本认识 1.2依赖关系、依赖方法 1.3具体操作步骤 1.4进一步理解 1.5默认设置 1.6make二次使用的解释 1.7两个文件的时间问题 1.8总是被执行 1.9特殊符号介绍 1.make/makefile介绍 1.1基本认识 make是一个指令,makefile是一…...

学习记录——day15 数据结构 链表

链表的引入 顺序表的优缺点 1、优点:能够直接通过下标进行定位元素,访问效率高,对元素进行查找和修改比较快 2、不足:插入和删除元素需要移动大量的元素,效率较低 3、缺点:存储数据元素有上限,当达到MAX后,就不能再…...

vue3实现在新标签中打开指定的网址

有一个文件列表,如下图: 我希望点击查看按钮的时候,能够在新的标签页面打开这个文件的地址进行预览,该如何实现呢? 比如: 实际上要实现这个并不难,参考demo如下: 首先&#x…...

Qt基础 | QSqlTableModel 的使用

文章目录 一、QSqlTableModel 的使用1.主窗口MainWindow类定义2.构造函数3.打开数据表3.1 添加 SQLite 数据库驱动、设置数据库名称、打开数据库3.2 数据模型设置、选择模型、自定义代理组件、界面组件与模型数据字段间的数据映射 4.添加、插入与删除记录5.保存与取消修改6.设置…...

RPA软件-影刀使用

流程自动化 影刀将操作进行抽象,分为一下几个对象: 网页自动化 (1) 网页自动化应用场景:网页操作、数据抓取 (2) 网页操作:基础操作-指令操作,智能操作-关联元素&#…...

HarmonyOS NEXT零基础入门到实战-第四部分

自定义组件: 概念: 由框架直接提供的称为 系统组件, 由开发者定义的称为 自定义组件。 源代码: Component struct MyCom { build() { Column() { Text(我是一个自定义组件) } } } Component struct MyHeader { build() { Row(…...

vue2获取视频时长

使用HTML5的video标签和JavaScript&#xff1a; <template><video ref"video" autoplay controls loop muted loadedmetadata"getVideoDuration"><source src"https://desktop-yikao.oss-cn-beijing.aliyuncs.com/avatar/kaissp.mp4&q…...

Linux中进程的控制

一、进程的创建 1、知识储备 进程的创建要调用系统接口&#xff0c;头文件 #include<unistd.h> 函数fork() 由于之前的铺垫我们现在可以更新一个概念 进程 内核数据结构&#xff08;task_struct, mm_struct, 页表....&#xff09; 代码 数据 所以如何理解进程的独…...

【源码】Sharding-JDBC源码分析之JDBC

Sharding-JDBC系列 1、Sharding-JDBC分库分表的基本使用 2、Sharding-JDBC分库分表之SpringBoot分片策略 3、Sharding-JDBC分库分表之SpringBoot主从配置 4、SpringBoot集成Sharding-JDBC-5.3.0分库分表 5、SpringBoot集成Sharding-JDBC-5.3.0实现按月动态建表分表 6、【…...

Java | Leetcode Java题解之第273题整数转换英文表示

题目&#xff1a; 题解&#xff1a; class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…...

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)

文章目录 一、简单选择排序原理二、C/C代码实现总结&#xff1a; 在计算机科学中&#xff0c;排序算法是一种非常基础且重要的算法。简单选择排序&#xff08;Selection Sort&#xff09;作为其中的一种&#xff0c;因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…...

使用vscode搜索打开的文件夹下的文件

右键空白处打开命令面板 摁一次删除键&#xff0c;删除掉图中的大于号 这样就能够找到例化的模块&#xff0c;文件具体在哪个位置&#xff0c;然后打开了...

力扣778.水位上升的泳池中游泳

力扣778.水位上升的泳池中游泳 二分 bfs class Solution {int dx[4] {1,0,-1,0},dy[4] {0,1,0,-1};public:int swimInWater(vector<vector<int>>& grid) {int n grid.size();auto check [&](int mid) -> bool{queue<pair<int,int>>…...

Nacos-2.4.0最新版本docker镜像,本人亲自制作,部署十分方便,兼容postgresql最新版本17和16,奉献给大家了

基于Postgresql数据库存储的nacos最新版本2.4.0,采用docker镜像安装方式 因业务需要,为了让nacos支持postgresql,特意花了两天时间修改了源码,然后制作了docker镜像,如果你也在找支持postgresql的nacos最新版本,恭喜你,你来的正好~ nacos-2.4.0 postgresql的数据库脚本…...

Halcon机器视觉15种缺陷检测案例_9找出所有网格顶点的位置

Halcon机器视觉15种缺陷检测案例_9找出所有网格顶点的位置 效果 原图 代码 *9找出所有网格顶点的位置 dev_update_off ()read_image (Image, 9找出所有风格顶点的位置) get_image_size (Image, Width, Height) *关闭已打开的窗口 dev_close_window ()dev_open_window (0, 0, …...

w30-python02-pytest入门

代码如下&#xff1a; import pytest class Test_Obj:"""测试类"""#用例级别前后置def setup(self):print(用例级别------的前置处理)def teardown(self):print("用例级别--------的后置处理")# 用例def test_case1(self):print(&quo…...

WPF+Mvvm项目入门完整教程-仓储管理系统(二)

目录 一、搭建一个主界面框架二、实现步骤1.主界面区域划分2.主界面区域实现 一、搭建一个主界面框架 主要实现主界面的框架样式和基础功能。这里特别说明一下&#xff0c;由于MvvmLight 已经过时不在维护&#xff0c;本项目决定将MvvmLight框架变更为 CommunityToolkit.Mvvm …...

SkyWalking入门搭建【apache-skywalking-apm-10.0.0】

Java学习文档 视频讲解 文章目录 一、准备二、服务启动2-1、Nacos启动2-2、SkyWalking服务端启动2-3、SkyWalking控制台启动2-4、自定义服务接入 SkyWalking 三、常用监控3-1、服务请求通过率3-2、服务请求拓扑图3-3、链路 四、日志配置五、性能剖析六、数据持久化6-1、MySQL持…...

exo项目目录架构

目录 .yml 文件是 YAML(YAML Aint Markup Language) exo项目目录架构 文件作用 topology、viz:项目拓扑结构可视化相关的代码或工具。 项目目录架构 文件作用 .yml 文件是 YAML(YAML Aint Markup Language) 文件的扩展名,YAML 是一种人类可读的数据序列化标准,通…...

mysql中where与on区别

WHERE子句 作用范围&#xff1a;WHERE子句主要用于过滤FROM子句返回的结果集。它可以在SELECT、UPDATE、DELETE语句中使用&#xff0c;以限制哪些行被包含在最终的查询结果中&#xff0c;或者哪些行被更新或删除。应用场景&#xff1a;当需要基于某些条件过滤结果集时&#xf…...

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件&#xff0c;常用于在两个集合之间进行数据转移&#xff0c;如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model&#xff1a;绑定右侧列表的值&…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

PL0语法,分析器实现!

简介 PL/0 是一种简单的编程语言,通常用于教学编译原理。它的语法结构清晰,功能包括常量定义、变量声明、过程(子程序)定义以及基本的控制结构(如条件语句和循环语句)。 PL/0 语法规范 PL/0 是一种教学用的小型编程语言,由 Niklaus Wirth 设计,用于展示编译原理的核…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r&#xff0c;求圆的面积。圆的面积应精确到小数点后5位。 例子&#xff1a; 输入&#xff1a;r 5 输出&#xff1a;78.53982 解释&#xff1a;由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982&#xff0c;因为我们只保留小数点后 5 位数字。 输…...

NLP学习路线图(二十三):长短期记忆网络(LSTM)

在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

Redis的发布订阅模式与专业的 MQ(如 Kafka, RabbitMQ)相比,优缺点是什么?适用于哪些场景?

Redis 的发布订阅&#xff08;Pub/Sub&#xff09;模式与专业的 MQ&#xff08;Message Queue&#xff09;如 Kafka、RabbitMQ 进行比较&#xff0c;核心的权衡点在于&#xff1a;简单与速度 vs. 可靠与功能。 下面我们详细展开对比。 Redis Pub/Sub 的核心特点 它是一个发后…...

【7色560页】职场可视化逻辑图高级数据分析PPT模版

7种色调职场工作汇报PPT&#xff0c;橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版&#xff1a;职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...