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

【源码】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题整数转换英文表示
题目: 题解: class Solution {String[] singles {"", "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine"};String[] t…...

数据结构之深入理解简单选择排序:原理、实现与示例(C,C++)
文章目录 一、简单选择排序原理二、C/C代码实现总结: 在计算机科学中,排序算法是一种非常基础且重要的算法。简单选择排序(Selection Sort)作为其中的一种,因其实现简单、易于理解而受到许多初学者的喜爱。本文将详细介…...

使用vscode搜索打开的文件夹下的文件
右键空白处打开命令面板 摁一次删除键,删除掉图中的大于号 这样就能够找到例化的模块,文件具体在哪个位置,然后打开了...
力扣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入门
代码如下: import pytest class Test_Obj:"""测试类"""#用例级别前后置def setup(self):print(用例级别------的前置处理)def teardown(self):print("用例级别--------的后置处理")# 用例def test_case1(self):print(&quo…...

WPF+Mvvm项目入门完整教程-仓储管理系统(二)
目录 一、搭建一个主界面框架二、实现步骤1.主界面区域划分2.主界面区域实现 一、搭建一个主界面框架 主要实现主界面的框架样式和基础功能。这里特别说明一下,由于MvvmLight 已经过时不在维护,本项目决定将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子句 作用范围:WHERE子句主要用于过滤FROM子句返回的结果集。它可以在SELECT、UPDATE、DELETE语句中使用,以限制哪些行被包含在最终的查询结果中,或者哪些行被更新或删除。应用场景:当需要基于某些条件过滤结果集时…...

铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
前端倒计时误差!
提示:记录工作中遇到的需求及解决办法 文章目录 前言一、误差从何而来?二、五大解决方案1. 动态校准法(基础版)2. Web Worker 计时3. 服务器时间同步4. Performance API 高精度计时5. 页面可见性API优化三、生产环境最佳实践四、终极解决方案架构前言 前几天听说公司某个项…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
Rust 异步编程
Rust 异步编程 引言 Rust 是一种系统编程语言,以其高性能、安全性以及零成本抽象而著称。在多核处理器成为主流的今天,异步编程成为了一种提高应用性能、优化资源利用的有效手段。本文将深入探讨 Rust 异步编程的核心概念、常用库以及最佳实践。 异步编程基础 什么是异步…...

【论文阅读28】-CNN-BiLSTM-Attention-(2024)
本文把滑坡位移序列拆开、筛优质因子,再用 CNN-BiLSTM-Attention 来动态预测每个子序列,最后重构出总位移,预测效果超越传统模型。 文章目录 1 引言2 方法2.1 位移时间序列加性模型2.2 变分模态分解 (VMD) 具体步骤2.3.1 样本熵(S…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...
Python ROS2【机器人中间件框架】 简介
销量过万TEEIS德国护膝夏天用薄款 优惠券冠生园 百花蜂蜜428g 挤压瓶纯蜂蜜巨奇严选 鞋子除臭剂360ml 多芬身体磨砂膏280g健70%-75%酒精消毒棉片湿巾1418cm 80片/袋3袋大包清洁食品用消毒 优惠券AIMORNY52朵红玫瑰永生香皂花同城配送非鲜花七夕情人节生日礼物送女友 热卖妙洁棉…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...

解读《网络安全法》最新修订,把握网络安全新趋势
《网络安全法》自2017年施行以来,在维护网络空间安全方面发挥了重要作用。但随着网络环境的日益复杂,网络攻击、数据泄露等事件频发,现行法律已难以完全适应新的风险挑战。 2025年3月28日,国家网信办会同相关部门起草了《网络安全…...