当前位置: 首页 > 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…...

AX-MES生产制造管理系统-总览

前言说起 MES 就不得不说 ERP&#xff0c;但是 ERP 大家基本上都知道&#xff0c;MES 就不一定了&#xff0c;常见的 ERP 系统包括 SAP、金蝶、用友等&#xff0c;ERP的流程相对来说也比较统一&#xff1b;MES就不同了&#xff0c;基本上熟悉业务流程的软件公司都可以开发并实施…...

Kerberos身份认证原理与实战排错指南

1. 为什么今天还要花时间搞懂 Kerberos&#xff1f;——一个被低估的“老协议”正在悄悄支撑着你的日常你每天登录公司内网查邮件、访问财务系统提交报销、用 Jenkins 构建代码、甚至在 Windows 域环境中打开一台同事的共享文件夹……这些看似顺滑的操作背后&#xff0c;大概率…...

如何删除论文脚注横线的方法——视图-草稿-引用——显示备注——删除脚注分隔符-即可。

如何删除论文脚注横线的方法——视图-草稿-引用——显示备注——删除脚注分隔符-即可。 Word中脚注线不会删&#xff1f;这里有妙招&#xff01;,教育,职业教育,好看视频...

告别拍脑袋规划!用ArcGIS做绿道选线:如何科学量化坡度、水域、道路成本并加权计算

科学规划绿道的ArcGIS高阶技法&#xff1a;从成本栅格构建到最优路径生成绿道规划从来不是简单的"两点之间直线最短"&#xff0c;而是需要综合考虑地形、生态、人文等多维因素的复杂决策过程。传统规划中常见的"拍脑袋"决策方式&#xff0c;往往导致建成后…...

【CP-05】RTE运行时环境 - SWC的操作系统接口

CP-05_RTE运行时环境【CP-05】RTE运行时环境 - SWC的“操作系统接口”前言在AUTOSAR架构中&#xff0c;RTE&#xff08;Runtime Environment&#xff0c;运行时环境&#xff09;是一个常被提及却难以理解的概念。它像是应用层软件组件&#xff08;SW-C&#xff09;与底层基础软…...

力扣HOT100(30)两两交换链表中的节点

链表的交换要注意 “链表不断链”。前驱和后继都要连着迭代法&#xff08;必学死磕&#xff01;O (n) 时间&#xff0c;O (1) 空间&#xff09;1. 为什么必须用虚拟头节点&#xff1f;因为交换后链表的头节点会变&#xff01; 比如示例 1 中&#xff0c;原来的头是 1&#xff0…...

Windows10下V-REP教育版安装保姆级教程(附百度网盘资源与避坑点)

Windows10系统V-REP教育版完整安装指南&#xff1a;从下载到实战避坑在机器人仿真和自动化控制领域&#xff0c;V-REP&#xff08;现更名为CoppeliaSim&#xff09;作为一款功能强大的跨平台机器人仿真软件&#xff0c;已经成为众多工科学生和研究人员的首选工具。特别是其教育…...

METSO A413248自动化系统

METSO A413248 自动化系统模块产品特点&#xff1a; 品牌归属&#xff1a;芬兰METSO&#xff08;美卓&#xff09;工业自动化系统原装备件。 产品类型&#xff1a;工业级自动化控制模块/接口模块。 核心功能&#xff1a;用于控制信号处理、数据采集及系统集成。 系统兼容&am…...

独立站内容分层:一层给 SEO,一层给 GEO

你的内容在喂两个完全不同的"阅读者" 你的博客文章&#xff0c;从来都不只有一个读者。 传统认知里&#xff0c;独立站内容的读者只有两类&#xff1a;真人访客和搜索引擎爬虫。SEO 优化的一切工作&#xff0c;本质上都是在讨好后者&#xff0c;顺带服务前者。 但…...

XZ6128A工作电压5-100V 输出电流5A 升压型大功率LED灯恒流驱动控制芯片

概述 XZ6128A是一款高效率、高精度的升压型大功率LED灯恒流驱动控制芯片。 XZ6128A内置高精度误差放大器&#xff0c;固定关断时间控制电路&#xff0c;恒流驱动电路等&#xff0c;特别适合大功率、多个高亮度LED灯串的恒流驱动。 XZ6128A采用固定关断时间的控制方式&#xff0…...