Linux的工具

Linux软件包管理器 yum

什么是软件包
在这里插入图片描述
Linux安装软件

  1. 源代码安装
  2. rpm安装
  3. yum安装 --解决安装源,安装版本,安装依赖 <------ 推荐

yum list 查看当前Linux中目前所支持的所有软件(别轻易尝试!!)

由于直接查找会找到太多的内容 所以 我们可以用grep指令来查找我们需要的
例如

yum list | grep XXX

在这里插入图片描述
yum install 软件名 可以下载我们刚刚查询到的软件
在这里插入图片描述
yum remove 软件名可以卸载已安装的软件
在这里插入图片描述
可以看到 当我们在卸载时 系统会问我们是否要删除
如果不想系统询问 我们可以加上-y选项
在这里插入图片描述
此时我们就发现系统没有进行询问, 直接就删掉了。
同理下载软件时也可以加入-y选项 让系统不提示直接下载
在这里插入图片描述

yum如何帮我们下载的?

我们在使用yum的时候非常方便, 一条指令就直接安装完毕了,可是yum是如何帮我们下载的呢?
其实就是yum存储了软件的下载链接, 当我们需要下载时,他就会自动帮我们去那个下载链接下载
存储的位置就在/etc/yum.repos.d

在这里插入图片描述

用yum下载准官方(第三方)软件 【扩展yum源】

yum install -y epel-release
在这里插入图片描述
此时就看到我们的yum存储的链接库里又多了两个
在这里插入图片描述
现在我们就可以用yum去安装一些非官方的好玩的软件拉~~
在这里插入图片描述

sl : 一个跑火车的动画

在这里插入图片描述

cowsay: 一个能自定义语言的表情包

在这里插入图片描述

关于 rzsz

这个工具是windows机器和远端Linux设备通过XShell传输文件

安装完毕后可以通过拖拽的方式将文件上传过去

rz 将电脑中的文件传到Linux上

在这里插入图片描述

sz 文件 将Linux中的文件传到windows中

在这里插入图片描述

vim编辑器

编辑器的核心作用是帮助我们进行文本编写的,也就是帮我们写代码的,而不是像visual studio 那样的集成开发环境(IDE)
vim是一个多模式的编辑器

  1. 命令模式
  2. 插入模式
  3. 底行模式

进入vim编辑器

vim 文件名 用vim打开该文件
在这里插入图片描述

编写文件

进入之后我们发现按很多键都无法输入, 这是因为此时的vim是出于命令模式我们所输出的字符都成了命令, 不会被打印在文件中, 那么如何编写这个文件呢?
我们只需要输入i命令 就可以使 vim 变成 insert模式, 这样我们就可以正常的进行编写文件啦
在这里插入图片描述
此时我们就可以正常的进行编写文件了。

在这里插入图片描述

退出文件

现在我们编写完了一个简单的程序, 那么我们该如何保存并退出vim编辑器呢?

  1. 首先我们需要从insert模式退回到命令模式 最简单的方法就是无脑按esc键, 当我们看到底部的insert不见后, 我们就回到了命令模式
    在这里插入图片描述

2.接下来 我们需要从命令模式切换到 底行模式
输入shift + ;(这个就是就是冒号)
此时底下就会出现一个冒号
在这里插入图片描述
此时我们在输出wq就可以退出了
w 单纯的保存
q 单纯的退出
两者在一起就是保存并退出了
在这里插入图片描述
查看一下文件, 发现刚刚写下的代码已经被保存了
在这里插入图片描述

vim三个主要模式之间相互的切换方法

在这里插入图片描述

命令模式

定位光标类

gg 将光标直接定位到文件的开头
shift + g(G)定位光标到最结尾
n + shift + g(nG)定位光标到第n行
shift + 4($)定位光标到当前行结尾
shift + 6(^)定位到行开头
w以单词为单位往后移动
b以单词为单位往前移动
h向左移动一个字符
j向下移动一个字符
k向上移动一个字符
l向右移动一个字符
yy 复制光标所在行

复制粘贴类

(n)dd剪切 / 按行删除 (n)行
p粘贴到光标行所在的下一行
n + p 在光标的下一行粘贴n行

大小写切换类

shift + (~) 将当前字符更改大小写 (长按会一直更改 直到 抵达当前行末尾)

修改类

(n)r + 字符 将光标以及光标后的字符进行批量化替换
shift + r(R) 批量化替换(进入替换模式 esc退出)
(n)x删掉光标所在的字符

撤销类

u撤回上一次更改
ctrl + r 撤回上一个撤回

底行模式

q 退出
w保存
vs 文件 分屏打开该文件 (ctrl w w切换屏幕)
w!强制保存
q!强制退出
!ls执行ls命令
!./文件执行该文件
/字符串 在当前文件里查找该字符串
set nu 调出该文件的行号

vim的配置

在家目录里创建一个.vimrc文件然后往里面加配置就好了, 具体配置可以去网上查询

一个用户一个vim配置文件,不会互相影响
一般不建议给root配置vim, 给普通用户配置vim就好

Linux编译器-gcc/g++使用

gcc与c++的使用选项几乎一致 所以这里我们就直接学习gcc的操作,g++的操作到时候直接平替过去就好了

语法:gcc 【选项】要编译的文件 【选项】【目标文件】
功能 编译该文件, 生成可执行文件
在这里插入图片描述

gcc如何完成编译

在这里插入图片描述

1. 预处理

1)去注释
2)头文件展开
3)条件编译
4)宏替换

补充 条件编译有什么用呢?

首先先认识条件编译
在这里插入图片描述
这么一段让编译器在不同宏定义下,编译结果不同的代码, 叫做条件编译。
它的作用是什么呢?
我们都知道有些软件分为不同的版本,比如:
社区版本 专业版
– | --------------- |
– | --------------- |
-免费 ------- 付费

作为提供这两个版本的公司我们需要维护两套代码吗?
当然不会,维护两份代码的成本太高, 而一般公司都会采用只维护付费版
然后根据不同的编译条件,裁剪掉社区版没有的功能即可。

使用gcc -E mycode.c -o mycode.i生成文件mycode.ii

我们使用vim打开mycode.i
在这里插入图片描述

此时我们就发现了不同之处

2. 编译(生成汇编语言)

使用gcc -S mycode.c -o mycode.s 生成汇编文件
在这里插入图片描述
发现我们现在就多了一个mycode.s文件
在这里插入图片描述
打开就可以发现,里面装的就是我们的代码所编出的汇编语言

3汇编(生成机器可识别码)

使用gcc -c mycode.c -o mycode.o生成机器可识别码文件
在这里插入图片描述
我们发现多了一个mycode.o文件
在这里插入图片描述
打开发现全部都是乱码,这是因为文件的内容其实是一堆二进制码
这是因为我们的mycode.o是二进制文件 而vim是文本文件,所以自然是无法正常看到里面的信息的

所以我们使用二进制文件查看工具od来进行查看
在这里插入图片描述
这样就正常的查看到了我们二进制文件的内容

4连接(生成可执行文件或库文件)

使用gcc mycode.o -o mytest生成可执行程序
在这里插入图片描述
此时我们发现生成了可执行程序mytest
我们用./mytest运行一下它试试
在这里插入图片描述
发现是可以正常执行的

gcc的选项

-o 自定义生成文件的名字

-o后一定接的是自定义的名字

gcc mycode.c -o mycode.exe
这样我们就生成了mycode.exe的可执行程序
在这里插入图片描述gcc -o mytest.exe mytest.c
不同的写法 同样的效果
在这里插入图片描述

-E 生成预处理文件

-E就是告诉gcc从现在开始进行程序的翻译, 一直到将预处理工作做完就停下来,不要再继续往后了;

-E后接的一定是文件源(也就是待编文件 mycode.c

gcc -E mycode.c -o mycode.i
如果不加-o默认将内容打印在显示器上, 这里是将内容输入mycode.i里
注意: 通常这里的文件名最好是一.i结尾

-S 生成汇编文件

-s 从现在开始进行程序的翻译,一直到将编译工作做完就停止;

-S后接文件源
gcc mycode.i -o mycode.s
-E不同的是
如果不加-o默认也会生成一个mycode.s的文件来存储结果
在这里插入图片描述

-c生成二进制文件

-c 从现在开始进行程序的翻译,一直到将汇编工作做完就停止;

-c后接文件源
gcc -c mycode.s -o mycode.o
在这里插入图片描述
-S一样 如果不加-o选项也会默认生成mycode,o

mycode.o

特别的
我们称这个文件为可重定位目标二进制文件简称目标文件(Windows下的
.obj文件)
这种文件虽然已经是二进制文件了, 但是仍然不可以独立执行 需要进行连接才可以执行
在这里插入图片描述

链接 —> 生成可执行文件

gcc mycode.o -o mytest

将目标文件 进行连接 形成最终的 可执行程序

在这里插入图片描述
执行一下试试
在这里插入图片描述

连接的过程是怎样的呢?

我们在写代码的时候会用到各种各样的,诸如printf库函数,这些函数我们并没有自己去实现,那么编译器是怎么实现他的呢?

首先, 头文件包含了这些库函数的声明, 而库函数的具体实现方法,是在库函数中包含的,gcc在连接过程中,会去对应的库里面找

库一般分为 动态库静态库
动态库
当编译器发现某个函数只有声明没有定义时,就会去动态库里面查找;
动态库连接的原理就是让编译器去不断的在他里面找,这种连接方式我们称为动态连接, 由于很多函数的实现是存在动态库内部的, 所以动态库是不能缺失的, 一旦缺失,许多的程序 以及 指令将会无法使用 我们可以使用ldd指令查看该文件所依赖的
在这里插入图片描述
我们可以看到, ls指令所依赖的各种库;
静态库
静态库与.o文件连接的方式与动态库并不相同, 静态库是将自身的内容直接复制一份,粘贴到程序中以完成连接,这种连接方式我们成为静态连接所以即使是后来静态库被删除了,也是不会影响我们程序的运行的。

注意: 动态库只能使用动态链接, 静态库只能使用静态连接。

如何使用静态连接

-static选项可以使我们的编译器采用静态连接的方式进行连接

注意, 系统默认是没有配置静态库的 所以直接去执行这串命令是无法成功执行的,所以在这之前我们需要安装静态库

yum安装静态库

使用sudo yum install -y glibc-static安装静态库
在这里插入图片描述

通过静态连接行程的可执行程序通常是远远大于通过动态链接形成的可执行程序, 所以我们通常是不会采用静态连接的;
在这里插入图片描述

1 如果我们没有安装静态库, 但是我们就要-static,是不能编译成功的
2 如果我们没有动态库,只有能被gcc找到的静态库, 不加任何选项的情况下 gcc也是可以完成编译工作的;
gcc 默认优先进行动态连接
3 形成的可执行文件, 不一定是纯的动态连接或是静态链接, 也有可能是混合着的;
-static就是将所有的连接要求变为静态连接

file指令

file 文件可以查看该文件是静态连接还是动态连接
在这里插入图片描述

动静连接的优缺点

动态库(共享库):
优点
可以有效的节省资源(形成可执行文件体积小节省磁盘空间, 节省内存空间(可执行程序运行时要加载到内存), 节省网络空间)
缺点
动态库一旦缺失, 会导致各个程序都无法运行
静态库:
优点
不依赖动态库, 编译好的可执行程序可以独立运行
缺点
编译好的可执行程序体积大,比较消耗资源;

debug 和 release 版本

默认编好的程序是release版本的
如果要改为debug版本我们可以添加-g选项
gcc mycode.c -o mytest_d -g
在这里插入图片描述
可以看到debug版本的文件会比release版本大上一点,这是因为debug版本是支持调试,添加了调试信息;

readdelf -S 指令

读取可执行文件的二进制构成
在这里插入图片描述
可以发现文件确实是带了debug信息

扩展:
在这里插入图片描述
如果想了解ELF格式 可以阅读一下以下书籍

《程序员的自我修养》 — 偏向编译原理
《深入理解计算机系统》 — 略难

Linux项目自动化构建工具-make/Makefike

make:是一条指令
makefile是一个当前目录下的文件

先见识一下是怎么用的

首先我们先写一段简单的代码在这里插入图片描述
然后我们创建一个Makefile文件然后再里面写入mytest:mytest.c
这表示文件的依赖关系
在这里插入图片描述
然后再下一行写入实现该依赖关系说需要执行的指令
gcc mytest.c -o mytest
在这里插入图片描述
最后保存退出后 我们执行指令make
在这里插入图片描述
可以发现系统自动帮我们输出这串指令
在这里插入图片描述
于是乎我们所需要的mytest文件就被编译出来啦

到现在我们就已经会了文件的编译, 那么接下来我们就要见识文件的删除同样, 我们先进入到Makefile文件里在下一行写入clean:这表示他的依赖关系为同样的,我们在下一行写入他的依赖方法:
rm -f mytest
习惯上我们会用.PHONY来修饰clean
所以就有了这个模样
在这里插入图片描述
现在我们就得到了一个可以编译和清理文件的Makefile文件啦
接下来 我们要清理项目的时候就可以使用make clean指令啦
外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上述的使用中,我们学到了诸如依赖关系依赖方法之类的新名词,那么现在我们来正式的学习一下make和Makefile

什么是依赖关系依赖方法

举一个简单的例子:
当你在学校里生活费用完了,你找你爸爸要生活费,为什么要找他要生活费,而不是找别人要生活费?因为他是你 爸爸 这就表明,你和你的老爸有依赖关系但是只是有依赖关系是不行的,就好比你给你老爸打电话说爸爸, 我是你儿子然后你就给挂了,你爸爸能明白你是想要干什么吗?无法知道。 你得告诉他我没钱了, 快给我卡里转点生活费他才能明白你要干什么;

所以,要想make能把你想干的事情,切实可行的实现,首先要有依赖关系其次还得有正确的依赖方法才能实现

Makefile依赖关系的自动推导

在这里插入图片描述

在这里插入图片描述
vim 能根据你写的内容 自动对文件所需要的依赖关系进行推导,推导过程类似与递归的过程 是栈式结构

最终,可以创建出目标文件

现在我们可以创建出目标文件了,但是另外一个问题就来了:
我们该如何去清理我们创建出来的这些文件呢?

Makefile如何清理文件

只需要再Makefile里加入clean操作, 他的依赖关系为空
如图:
在这里插入图片描述
接下来,在他的下一行写下 依赖操作即可

rm -rf mytest.o mytest.s mytest.i myteat

在这里插入图片描述

make是至顶向下的扫描makefile文件的

如图
在这里插入图片描述
如果我们将clean操作放在makefile文件的最上方, 那么我们再执行make操作会发生什么事情呢?
在这里插入图片描述
我们发现他执行的是clean指令, 而不是像之前那样执行编译操作

而如果我们执行编译的操作变成了make mytest
(这是因为 make mytest就是指明我要make执行该依赖关系以及其依赖方法;)
在这里插入图片描述

所以我还是建议大家 不要把clean操作放在最上边, 这样我们就可以直接用make去编译文件

make不会重复编译源文件

我们在用make编译文件时, 如果某个文件被编译过并且源文件并未改变, 那么make将不会再替我们去编译了
在这里插入图片描述
这是为了提高我们的编译效率

它是怎么做到的呢?

一定是由源文件形成的可执行程序, 所以一般而言, 我们源文件的修改时间, 一定是比 我们的 可执行文件 老!

如果我们更改了源文件, 那么历史上的可执行程序一定比现在的源文件

所以答案就出来了:我们只需要对比二者的最近修改时间就可以了

时间相关
stat命令

查看文件的时间问题
1 access 最近访问时间
2 modify 最近修改时间 (对文件内容进行修改)
3 change 最近修改时间 (对文件属性进行修改)
在这里插入图片描述
文件内容: 文件里面装着的内容 例如: 源代码
文件属性: 文件的权限,大小之类的
(如果文件内容被改了, 通常文件属性也会一起被改(文件大小))

补充说明

由于access在使用中被修改的次数实在是过于多了, 几乎任何操作都会修改它, 而当多个用户去使用该系统时, 过多的更改可能会使得其效率变慢,所以有些时候系统并不会被修改access

touch命令

touch 后如果是跟不存在的文件, 那么就是创建改文件,
而如果是跟上已经存在的文件, 那么就会变成修改该文件的所有时间

-m 选项

修改modify时间

-a选项

修改access时间

-c选项

修改change时间

回到刚刚的话题, make是如何判断源文件的新旧的呢?
答案是比较源文件可执行文件modify时间即可

在这里插入图片描述
当我们修改了源文件的时间后就发现, 我们又可以正常的编译文件啦!

总结: make会根据源文件和目标文件的新旧,判定是否需要重新执行依赖关系进行编译;

但是!! 如果我们想让对应的依赖关系 总是被执行呢?

make总是执行对应的依赖关系

.PHONY 修饰我们所需要的目标文件
这就是告诉我们的make.PHONY所修饰的目标文件和其依赖关系, 总是被执行, 不要管什么时间问题
在这里插入图片描述
现在我们就可以发现, 无论我进行多少次make都可以正常执行了

我们称被.PHONY修饰的目标为伪目标 代表的含义为总是被执行

但是其实在一般情况下, 我们不建议去修饰我们需要生成的目标文件
而是建议将clean操作进行修饰, 使得clean操作总是被执行, 目前我们的clean只进行rm操作, 不需要修饰也可以一直执行, 但是未来我们的clean不一定只有rm操作, 所以还是建议大家用.PHONY去修饰我们的clean

特殊符号

$@ 代表的是依赖关系左侧的目标文件(冒号左侧)
$^ 代表的是依赖关系右侧的依赖文件(冒号右侧)

所以我们在写依赖关系的时候,可以不用再写一遍文件名
在这里插入图片描述

在执行的时候,我们发现,操作系统给我们将这两种符号回显了;

如果我们不想让他回显呢?
在这里插入图片描述
只需要在依赖指令前加上@符号即可;

在这里插入图片描述
这样我们执行make指令的时候, 就不会在看到系统回显的指令了;

  • 44
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值