【Hello Linux】Linux工具介绍 (make/makefile git)
作者:@小萌新
专栏:@Linux
作者简介:大二学生 希望能和大家一起进步!
本篇博客简介:介绍Linux的常用工具make/makefile git
Linux项目自动化构建工具 – make/Makefile
背景
- 会不会写Makefile 从侧面说明了一个人是否具备完成大型工程的能力
- 一个工程的源文件不计其数 按照其类型、功能、模块分别放在若干个目录当中 Makefile定义了一系列的规则来指定:哪些文件需要先编译 哪些文件需要后编译 甚至于进行更复杂的功能操作
- Makefile带来的好处就是“自动化编译” 一旦写好 只需一个make命令 整个工程完全自动编译 极大的提高了软件开发的效率
- make是一个命令工具 是一个解释Makefile当中指令的命令工具 一般来说 大多数的IDE都有这个命令 例如:Delphi的make VisualC++的nmake Linux下GNU的make 可见 Makefile都成为了一种在工程方面的编译方法
- make是一条命令 Makefile是一个文件 两个搭配使用 完成项目自动化构建
依赖关系和依赖方法
在使用make/Makefile前我们首先应该理解各个文件之间的依赖关系以及它们之间的依赖方法
依赖关系: 文件A的变更会影响到文件B 那么就称文件B依赖于文件A

比如说我们这里的test.c文件 只要它改变了的话 test.i test.s test.o 可执行文件都会发生变化
所以我们说后面的这些文件是依赖于test.c的
当然如果要是进一步细分的话 我们还可以说 test.s 是依赖于 test.i的
test.o是依赖于 test.s的 依次类推
依赖方法: 如果文件B依赖于文件A 那么通过文件A得到文件B的方法 就是文件B依赖于文件A的依赖方法

在上面这个图中 test.c经过某种方法变成了 test.i
那么我们就可以说这个方法是依赖方法
多文件编译
当我们的工程中有多个源文件的时候我们应该怎么进行多文件编译呢?
有两种方法
第一种 我们可以直接使用gcc对两个文件进行编译 生成一个可执行文件
指令如下
gcc main.c test.c -o mytest.c

但是我们一般不这么做 因为一旦多个源文件中有一个改变了我们就需要将所有的源文件重新编译链接
第二种 每个源文件各自生成自己的二进制文件 然后再将这些二进制文件通过链接生成可执行程序
这样子就算是一个源文件需要修改我们只需要重新编译它的二进制文件就好了
指令表示如下
gcc -c main.c -o main.ogcc -c test.c -o test.o

之后我们将这两个二进制文件链接即可
指令如下
gcc test.o main.o -o mytest
这里有一个注意点 我们链接的时候并不需要主动去链接头文件 因为编译器会自动识别我们使用#include 包含的头文件
随着源文件的增多 我们每次需要敲的指令就会变得很长 为了方便我们的操作我们这里就可以使用 make/makefile了
首先我们需要在源文件所在目录下创建一个名为Makefile/makefile的文件

之后我们便可以开始编写makefile文件了

之后我们便可以开始使用make进行编译

我们发现这里成功生成了可执行文件和中间的二进制文件
Makefile文件的简写方式:
- $@:表示依赖关系中的目标文件(冒号左侧)
- $^:表示依赖关系中的依赖文件列表(冒号右侧)
- $<:表示依赖关系中的第一个依赖文件


项目清理
每次运行结束之后都要我们手动清理未免有点太麻烦了 刚好我的makefile支持这个功能
它的语法格式是这样子的

首先需要写下这样一段代码
.PHONY:clean
clean:
.PHONY修饰后面的东西我们一般把他称为伪目标
什么是伪目标呢?
伪目标就是总是可以被执行的目标
后面的就是编写这个伪目标了
make原理
- make会在当前目录下找名字为“Makefile”或“makefile”的文件
- 如果找到 它会找文件当中的第一个目标文件 在上面的例子中 它会找到mytest这个文件 并把这个文件作为最终的目标文件
- 如果mytest文件不存在 或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新 那么它就会执行后面的依赖方法来生成mytest文件
- 如果mytest所依赖的test.o文件不存在 那么make会在Makefile文件中寻找目标为test.o文件的依赖关系 如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)
- 如果test.c文件和main.c文件是存在的 make会生成test.o文件和main.o文件 然后再用test.o文件和main.o文件生成最终的mytest文件
- make会一层又一层地去找文件的依赖关系 直到最终编译出第一个目标文件
- 在寻找的过程中 如果出现错误 例如最后被依赖的文件找不到,那么make就会直接退出 并报错
Linux版本控制工具 --git
git的介绍
git是一个分布式版本控制系统 它可以快速高效地处理从小型到大型的各种项目
它的作用有
- 能够记录文档的改动历史
- 能够回滚到任意一个修改时间点
- 能够协作编辑文件
git的安装
在下载之前我们可以通过 --version指令来查看自己的云服务器上是否安装了git

如果自己的云服务器上没有安装git那我们则需要通过下面的命令来安装
sudo yum install -y git
git的使用
我们可以使用git来克隆一个代码仓库
首先我们可以在gitee上建立一个代码仓库
具体教程在bilibili很简单可以搜索到
在创建了一个新的代码仓库之后我们可以获取这个仓库的https链接

之后我们可以在linux中新建一个目录作为我们的代码仓库

我们创建完“仓库” 之后进入之
输入指令 git clone + https网址

之后我们就在gitee下克隆出来一个新的代码仓库啦
我们可以看到本地的仓库和gitee上仓库是一样的


那么如何上传我们的本地文件到gitee上的代码仓库呢?
只需要按照下面的三步走就可以实现上传功能
add
首先我们创建一个test目录作测试用
之后输入如下指令
git add test

它的意思是上传test文件
commit
之后我们需要commit确认我们上传的文件并且要添加日志
输入如下指令即可
git commit -m “log”
其中log代表的是本次提交的日志信息
当我们第一次提交的时候会出现这样子的报错

这是因为git需要确认我们的身份
这个时候按照它给我们的报错信息 输入我们的邮箱和姓名即可

push
最后我们可以通过push指令来讲确认后的命令上传到gitee仓库

当然最后我们需要输入下自己的账号和密码 这样子的设计也是很合理的
避免了有人在只知道你邮箱的情况下上传一些无关文件到你的仓库
之后我们在test空目录中加上文件再次完成这一套操作

我们可以发现确实同步了
git上传的文件应该如何删除呢?
git的删除和git的添加很像
我们只需要多加一步操作
git rm “xxx”

之后再重复 add commit push就可以了

我们可以发现文件确实被删除了
我们怎么查看历史提交呢?
我们只需要输入 git log指令 就能够查看之前所有提交的日志

相关文章:
【Hello Linux】Linux工具介绍 (make/makefile git)
作者:小萌新 专栏:Linux 作者简介:大二学生 希望能和大家一起进步! 本篇博客简介:介绍Linux的常用工具make/makefile git Linux项目自动化构建工具 – make/Makefile 背景 会不会写Makefile 从侧面说明了一个人是否具…...
享元模式flyweight
享元模式属于结构型模式。享元模式是池技术的重要实现方式,它可以减少重复对象的创建,使用缓存来共享对象,从而降低内存的使用。细粒度的对象其状态可以分为两种:内部状态和外部状态。应用场景系统存在大量相似或相同的对象。外部…...
Pulsar
一、简介Apache Pulsar是Apache软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、…...
项目介绍 + 定长内存池设计及实现
你好,我是安然无虞。 文章目录项目介绍当前项目做的是什么?技术栈内存池是什么?池化技术内存池内存池主要解决的问题malloc定长内存池学习目的定长内存池设计项目介绍 当前项目做的是什么? 这个项目是实现一个高并发的内存池, 它的原型是 Google 的一个开源项…...
Linux--线程安全的单例模式--自旋锁--0211
1. 线程安全的单例模式 1.1 什么是单例模式 某些类, 只应该具有一个对象(实例), 就称之为单例. 1.1.1 懒汉方式实现单例模式 以上篇博文的线程池为例 Liunx--线程池的实现--0208 09_Gosolo!的博客-CSDN博客 实现懒汉模式首先要先将构造函数私有化,…...
图文解说S参数(进阶篇)
S参数是RF工程师/SI工程师必须掌握的内容,业界已有多位大师写过关于S参数的文章,即便如此,在相关领域打滚多年的人, 可能还是会被一些问题困扰着。你懂S参数吗? 图文解说S参数(基础篇) 请继续往下看...台湾…...
Sentinel源码阅读
基础介绍 Sentinel 的使用可以分为两个部分: 核心库(Java 客户端):不依赖任何框架/库,能够运行于 Java 8 及以上的版本的运行时环境,同时对 Dubbo / Spring Cloud 等框架也有较好的支持(见 主流框架适配&…...
2023年浙江食品安全管理员考试真题题库及答案
百分百题库提供食品安全管理员考试试题、食品安全管理员考试预测题、食品安全管理员考试真题、食品安全管理员证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、判断题 7.(重点)《餐饮服务食品安全…...
Webstorm 代码没有提示,uniapp 标签报错
问题 项目是用脚手架创建的: vue create -p dcloudio/uni-preset-vue my-project 打开之后,添加view标签警告报错的。代码也没有提示,按官方说法:CLI 工程默认带了 uni-app 语法提示和 5App 语法提示。 但是我这里就是有问题。…...
MySQL-Innodb引擎事务原理
文章目录1.事务介绍2 事务特性3. 事务的实现原理4 redo log 保证持久性5 undo log 保证原子性6 MVCC 概念6.1 隐藏字段6.2 版本链6.3 ReadView6.3.1readview 版本控制规则7 隔离性 实现7.2 隔离性- REPEATABLE READ 可重复读下8 一致性1.事务介绍 事务是一组操作的集合…...
Linux操作系统学习(了解环境变量)
文章目录环境变量初识除了上述介绍的PATH,还有一些常见的环境变量如:查看环境变量方法 :环境变量的基本概念:本地变量:环境变量初识 环境变量解释起来比较抽象,先看示例: #include <stdio.…...
数据分析思维(六)|循环/闭环思维
循环/闭环思维 1、概念 在很多的分析场景下,我们需要按照一套流程反复分析,而不是进行一次性的分析,也就是说这套流程的结果会成为该流程的新一次输入,从而形成一个闭环,此时的分析思维我们称之为循环/闭环思维。 常…...
C++:类和对象(下)
文章目录1 再谈构造函数1.1 构造函数体赋值1.2 初始化列表1.3 explicit关键字2 static成员2.1 概念2.2 特性3 友元3.1 友元函数(流插入(<<)及流提取(>>)运算符重载)3.2 友元类4 内部类5 匿名对…...
ASP.NET Core MVC 项目 AOP之IResultFilter和IAsyncResultFilter
目录 一:说明 二:IActionFilter同步 三:IAsyncActionFilter异步 一:说明 IResultFilter同步过滤器与IAsyncResultFilter异步过滤器常常被用作于渲染视图或处理结果。 IResultFilter同步过滤器执行顺序: 1:执行控制器中的构造函数,实例化控制器 2:执行具体的Acti…...
jstack排查cpu占用高[复习]
这样就可以看到占用CPU高的代码位置。 总结:就是先查到占用高的应用和具体的线程,然后根据线程到堆积信息查找即可。 不过堆栈信息非十进制,需提前把线程号转为十六进制。 这样就可以看到占用CPU高的代码位置。 总结:就是先查到…...
网络安全-Pyhton环境搭建
网络安全-Pyhton环境搭建 https://www.kali.org/get-kali/#kali-installer-images—kali官网下载地址 python这个东东呢 是目前来说最简单,方便的开源的脚本语言 广泛用于Web开发,AI,网站开发等领域 python要装2和3 为什么要安装两个版本…...
SpringBoot Mybatis 分页实战
pageInfo的属性 pageNum:当前页 pageSize:页面数据量 startRow:当前页首条数据为总数据的第几条 endRow:当前页最后一条数据为总数据的第几条 total:总数据量 pages:总页面数 listPage{}结果集 reasonable …...
计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性
计算机断层扫描结肠镜和全自动骨密度仪在一次检查中的可行性 Feasibility of Simultaneous Computed Tomographic Colonography and Fully Automated Bone Mineral Densitometry in a Single Examination 简单总结: 数据:患者的结肠镜检查和腹部CT检查…...
Java多级缓存是为了解决什么的?
前言 提到缓存,想必每一位软件工程师都不陌生,它是目前架构设计中提高性能最直接的方式。 缓存技术存在于应用场景的方方面面。从网站提高性能的角度分析,缓存可以放在浏览器,可以放在反向代理服务器,还可以放…...
MongoDB--》索引的了解及具体操作
目录 索引—index 索引的类型 索引的管理操作 索引的使用 索引—index 使用索引的原因:索引支持在MongoDB中高效地执行查询。如果没有索引,MongoDB必须执行全集合扫描,即扫描集合中的每个文档,以选择与查询语句匹配的文档。这…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【配置 YOLOX 用于按目录分类的图片数据集】
现在的图标点选越来越多,如何一步解决,采用 YOLOX 目标检测模式则可以轻松解决 要在 YOLOX 中使用按目录分类的图片数据集(每个目录代表一个类别,目录下是该类别的所有图片),你需要进行以下配置步骤&#x…...
Spring AI与Spring Modulith核心技术解析
Spring AI核心架构解析 Spring AI(https://spring.io/projects/spring-ai)作为Spring生态中的AI集成框架,其核心设计理念是通过模块化架构降低AI应用的开发复杂度。与Python生态中的LangChain/LlamaIndex等工具类似,但特别为多语…...
初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...
招商蛇口 | 执笔CID,启幕低密生活新境
作为中国城市生长的力量,招商蛇口以“美好生活承载者”为使命,深耕全球111座城市,以央企担当匠造时代理想人居。从深圳湾的开拓基因到西安高新CID的战略落子,招商蛇口始终与城市发展同频共振,以建筑诠释对土地与生活的…...
深入浅出深度学习基础:从感知机到全连接神经网络的核心原理与应用
文章目录 前言一、感知机 (Perceptron)1.1 基础介绍1.1.1 感知机是什么?1.1.2 感知机的工作原理 1.2 感知机的简单应用:基本逻辑门1.2.1 逻辑与 (Logic AND)1.2.2 逻辑或 (Logic OR)1.2.3 逻辑与非 (Logic NAND) 1.3 感知机的实现1.3.1 简单实现 (基于阈…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
关于easyexcel动态下拉选问题处理
前些日子突然碰到一个问题,说是客户的导入文件模版想支持部分导入内容的下拉选,于是我就找了easyexcel官网寻找解决方案,并没有找到合适的方案,没办法只能自己动手并分享出来,针对Java生成Excel下拉菜单时因选项过多导…...
LCTF液晶可调谐滤波器在多光谱相机捕捉无人机目标检测中的作用
中达瑞和自2005年成立以来,一直在光谱成像领域深度钻研和发展,始终致力于研发高性能、高可靠性的光谱成像相机,为科研院校提供更优的产品和服务。在《低空背景下无人机目标的光谱特征研究及目标检测应用》这篇论文中提到中达瑞和 LCTF 作为多…...
