【Linux的 yum_vim工具篇】

Linux的yum_vim工具篇

前言:
前篇开始进行学习了Linux的基础知识以及shell原理和权限,这篇介绍学习LInux的指令如何开始使用linux yum_vim工具等内容.
/知识点汇总/

简单介绍:
1.yum — 软件安装
2.vIm — 编译器及配置
3.gcc/g++ — 编译器
4.gdb — 调试工具
5.make/Makefile — 全局编译

1、Linux软件包管理器yum

1.1、yum是什么?

yum类似于我们常见的“应用商店”
yum理解是一个软件下载安装管理的一个客户端,小米应用商店、华为应用商城。
Linux中软件包可能有依赖关系 — yum会帮我们解决依赖关系的问题。

1.2、软件包是什么?软件包是谁给提供的呢?

软件包是yum里提供的资源。
软件包的提供:本质还是操作系统的开源社区优质,活跃生态等条件因素。

1.3、Linux系统(其中的centos 7)生态

首先得知道,在Linux中安装软件有三种方式
1.源代码安装
因此经过程序员通过各种不同的环境编译好解决环境问题
2.rpm包安装
需要解决库,移植性/环境/交叉编译的报错等问题,有很多问题和麻烦
3.yum命令安装
所以yum是最简单最便捷的安装方式

yum install xxx (安装)

并且本地服务器是内置了目标服务器的地址链接的,这样才能准确找到调用下载的软件地址,下载安装数据。

2、yum的相关操作

2.1、yum基本指令格式

yum list | grep xxx

相当于软件商店的搜索功能,管道+grep指定特定的软件

yum list | grep s1.x86_64 [sudo/root] yum install [-y] xxx
[sudo/root] yum remove [-y] xxx

2.2、软件源

base,基本软件源,稳定

ls /etc/yum.repos.d/

epel,扩展软件源

sudo yum -y install -y epel-release

3、yum的本地配置

3.1、配置将来是干什么的?

常见的就是像,镜像国外的数据源,方便国内使用。
yum根据/etc/repos.d/该路径下面的配置文件,来构成自己的下载链接,(根据OS版本,根据你下载的软件),yum会帮助我们下载,并安装。
一般的机器,其会内置的链接地址是centos的官网,软件链接都指向的是国外的,yum可能会比较慢,所以需要配置。

3.2、那么如何配置?

本质就是更改文件或文件内容。

mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
wget -O /etc/repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo

接着,清除缓存、生成缓存、升级更新

yum clean all
yum makecache
yum -y update
(一般需要联网)

方便windows和linux进行文件传输(拖拽)

rzxz -->lrzxz
yum list | grep lrzxz
sudo yum install -y lrzsz.x86_64
rz [-E] filename – windows–》linux
sz filename – linux —》windows

4、vi/vim编辑器

4.1、vim概念和模式介绍

功能:vim本质就是编辑器
多模式:命令模式、底行模式、插入模式

刚开始使用vim filename.c默认无法输入,因为默认是进入的命令模式

命令模式:允许使用者通过命令,来进行文本的编辑控制。
命令模式进入到插入模式(按键i)inster,可正常输入。

底行模式:相对于对外的控制,用来让vim进行包括但不限于shell进行交互的。
由插入模式结束输入后,(键入:)进入底行模式,输入wq即可退出。底行进行命令模式,(键入esc)。

插入模式:就是编辑模式,输入内容。
插入模式待输入完成后,(键入esc)进入命令模式,结束输入

4.2、各个模式的常用项

1.命令模式:
[n] + yy :复制当前行,[n]选中多行/区域复制
[n]+ p :粘贴到当前光标位置的下一行,[n]表示重复粘贴n次
u :撤销当前光标位置行
ctrl + r :撤销对撤销的撤销
[n] + dd :剪切/删除指定的行,[n] 剪切或删除光标行以下多行
$ :将光标定位到当前行的结尾
^ :将光标定位到当前行的开头
gg :将光标定位到整个文本的最开头
G :将光标定位到整个文本的最结尾
n + G :将光标指定到指定行
[n] + “h,j,k,l”:命令模式下的,左下上右,[n]表示可虽方向移动指定n个位置(快速记忆:h(最左边),j(jump,向下跳),k(king,国王高高在上),l(最右边))
w :将光标按照单词为w单位进行后移
b :将光标按照单词为单位进行前移
~ :切换已输入的文本大小^^写(单击/长按)
[n]+ x :删除光标位置之后的内容(单击/长按),[n]表示这行指定长度的删除
[n]+ X :删除光标位置之前的内容(单击/长按),[n]表示这行指定长度的删除
[n] + r :对光标指定的位置进行内容替换,不用删除,[n]表示一次替换多个
R :进入替换模式(replace),直接进行可输入文本完成文本替换
组合yy 10p:连续复制粘贴10行
命令模式进入插入模式:a,i,o都可以。区别就是光标的起始位置不同。
插入模式回退命令模式,无脑esc即可。
shift+zz(ZZ): 保存并退出

2.底行模式:
w:保存
q:退出
wq:保存并退出
!:强制
:q! :强制退出不保存
:wq :保存并退出
:wq! :强制保存并退出
set nu:显示行号
set nonu:关闭行号
/+关键字 :搜索查找
:!command :等同于在终端正常的使用shell命令
:vs filname :分屏(多文件操作)编辑,支持数据交互(复制粘贴)
ctrl+ww :将光标切换屏幕操作

3.插入模式:
插入不能直接进入底行模式,必须通过命令模式转换,所以命令是核心模式
注意:ctrl + z并不是退出,而是后端暂停vim。
解决:ps ajx | grep vim —>kill -9 pid
ls -al
rm .filname即可
临时文件的键入D,本质就是rm掉临时文件

补充:
1.如何注释?批量注释?如何去掉注释?

ctrl+v :进入视图模式。
ctrl+v+“h,j,k,l”(鼠标)区域选择(或G到文件末尾或n+G指定多行),键入I+//+最后键入两次esc即可注释
即:crtl+v -->h,j,k,l区域选择–比如j—>shift+i=I—>//—>esc*2
去掉注释:
ctrl+v–>h,j,k,l下拉区域(包含仅包含//)—>d(+l选择多行) 即可

2.普通用户解决sudo的提权问题。

ls /etc/sudoers
配置sudoers文本文件,使普通文件配置为信任用户即可

5、gcc/g++编译器

5.1、安装:g++

yum install -y gcc-c++

另外一些标准问题:
C:std=C99 — 使用C99标准
C++:std=C++11 — 使用C++11标准

5.2、编译步骤

touch text.c -->vim text.c–>gcc -o text.exe text.c(gcc 没有选项-o时,则默认生成的可执行文件为a.out)
touch text.cc/text.cpp -->vim text.cc–>注意:gcc不能用来编译C++代码(gcc -o textC++.exe text.cc报错),所以得使用g++ 编译,即:g++ -o textC++.exe text.cc

5.3、程序的基本编译过程

编译过程 gcc遍历命令 选项 说明
预处理 gcc -E text.c -o text.i -E从现在开始进行程序的翻译,待预处理完成就停下 进行宏替换、去掉注释、头文件展开、条件编译
编译 gcc -S text.i -o text.s -S从现在开始进行程序的编译,编译完成就停止 将C语言编译为汇编语言
汇编 gcc -c text.s -o text.o -c从现在开始进行程序的翻译,汇编完成就停下来 将汇编语言翻译成二进制机器语言生成.obi目标文件
链接 gcc text.o -o my.exe 形成最终的.exe可执行程序

总结:选项 :-E S c 后缀名:.i s o

5.4、其中命令行可输入宏

gcc -D宏名=num filename.c
如:
gcc -DV1=1 project.c
gcc -DV2=1 project.c
gcc -DV3=1 project.c

5.5、编译器的自举过程

补充:
二进制编程(打孔机) --> 汇编 —> C语言
汇编的编译器(二进制写出来的) C编译器(汇编写出来的)

又因为本质编译器也是软件,所以:
迭代更新,以汇编自己写汇编编译器,同理,先有会编写,再有C自己写自己的C编译器
这样的迭代称为:编译器的自举过程

6、动静态链接

6.1、链接过程是什么?什么是静动态库?

链接就是将我们的程序与库结合(才可调用)的过程。语言一定要有自己的标准库

ldd my.exe 查看当前可执行程序链接的库信息
C语言常库:libc库 ,有大量对应的头文件(相当于调用方法集)
所以安装开发环境:安装C标准库 + C头文件

库分为:动态库、静态库

Linux中后缀:
动态库:.so
静态库:.a

windows中后缀:
动态库:.dll
静态库:.lib

6.2、为什么要有链接这步骤?为什么要有库?

1.让开发站在巨人的肩膀上;
2.提高开发效率、提高维护、移植性等等优势。
Linux中:
动态库:.so
静态库:.a
提供两种连接方式:就是动态链接 和 静态链接

动态链接:就是链接到共享动态库,但是一旦动态库缺失,那么所有的动态链接这个库的程序都无法执行了,崩溃。
静态库:把资源拷贝到本地库。即:在编译的时候,把库中的方法,拷贝到我自己的可执行程序中静态链接。不再关系任何的库的缺失。

补充:
C动态库:默认提供的是动态库,采用动态链接。
静动态库文件大小相差巨大。

6.3、静动态库总结

动态库&&动态链接的优缺点

1.动态库不能缺失
2.节省资源

静态库&&静态链接的优缺点

1.占用资源大,浪费资源
2.一旦形成就和库无关了

查看静态库:

ls /lib64/libc.a -l
ls /usr/lib64/libc.a -l

补充运行静态库程序:
gcc -o test_static.exe text_static.c -static
默认情况下,无法执行静态链接的。
说明:默认情况下,Linux一般静态库默认是没有安装的

7、make/Makefile自动化构建工具

7.1、makefile的简单应用

步骤:

touch makefile
vim makefile

格式:

(目标文件:依赖文件列表)括号整体称为依赖关系(文件列表可以为空)
[tab] 依赖方法
如:
mytext:test.c
[tab]gcc -o mytext test.c

make命令:

make自动编译makefile执行里面的语句,生成mytest可执行程序,然后./mytest运行即可

另外,除了构建命令语句,还可以执行clean:

如:
mytext:test.c
[tab]gcc -o mytext test.c
.PHONY:clean
clean:
[tab]rm -f mytest

7.2、依赖关系,依赖方法

先有关系,再有方法,关系和方法都是执行的必要条件

.PHONY:xxx
xxx对应的方法,总是要执行的
.PHONY:约束依赖关系对应的依赖方法,总是要执行的
本质就是取消对源程序和可执行程序的时间判定,所以才能总被执行。

7.3、make和makefile的原理

本质区别:make是一个命令;而Makefile是一个文件

make会根据makefile的内容,完成编译/清理等操作,并且make单独执行时,是从代码第一句开始执行,并依次形成第一个目标文件…
想要跳过前面的目标文件,执行后面的目标文件就需要命令行make时加上目标文件名即可,如:make clean

a.为什么makefile对最新的可执行程序。默认不想重新形成呢?
提升编译效率(考虑对于大量的工程文件情况)

b.怎么做到的?makefile怎么知道我的程序需要被编译了呢?
因为会自动识别时间,根据对比源文件和可执行程序的系统时间,进行的判定。

对比可知:可执行文件的最近修改时间和源文件最近的修改时间,谁更新?

回顾:touch指令
touch text.c
功能1:当文件已存在,touch执行的是更新文件的系统当前时间
功能2:否则就是文件不存在,就创建一个空文件

makefile的样例:

code.exe:code.c
[Tab]gcc -o $@ $^
.PHONY:clean
clean:
[Tab]rm -f code.exe

解释说明:

$@ —>替换目标文件(code.exe)
$^ —>替换文件列表(code.c)

本质是逐步生成的:

code.exe:code.o
[Tab]gcc code.o -o code.exe
code.o:code.s
[Tab]gcc code.s -o code.o
code.s:code.i
[Tab]gcc -S code.i -o code.s
code.i:code.c
[Tab]gcc -E code.c -o code.i

makefile/make会自动根据文件中的依赖关系,进行自动推导我们执行所有相关的依赖方法。(栈、递归)

makefile中同样支持变量的,类似于宏替换。
格式:
bin=+变量名(目标文件)
src=变量名(依赖文件)[空格]
如:
bin=code.exe
src=code.c

当不想显示出命令行只需要在依赖方法前添加一个@即可。
如:[Tab]@gcc -o $@ $^

8、Linux的调试工具gbd

8.1、背景

程序的发布方式有两种模式:debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

8.2、基本使用方法和gbd指令

gdb binFile 退出: ctrl + d 或 quit 调试命令:
list/l +行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l +函数名:列出某个函数的源代码。
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
finish:执行到当前函数返回,然后挺下来等待命令
print§:打印表达式的值,通过表达式可以修改变量的值或者调用函数
p 变量:打印变量值。
set var:修改变量的值
continue(或c):从当前位置开始连续而非单步执行程序
run(或r):从开始连续而非单步执行程序
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
info(或i) breakpoints:参看当前设置了哪些断点
display 变量名:跟踪查看一个变量,每次停下来都显示它的值
undisplay:取消对先前设置的那些变量的跟踪
until X行号:跳至X行
breaktrace(或bt):查看各级函数调用及参数
info(i) locals:查看当前栈帧局部变量的值
quit:退出gdb

程序的发布方式有两种模式:debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式,而程序员多数使用的是debug模式,测试人员/用户是release模式。
其次,debug模式下,生成的可执行程序具有调试信息,所以相比release版本发布的可执行程序更大。

8.3、gdb的使用

运行调试:

gdb + filename

退出:

quit

查看内容:默认10行(但gdb会记录最近一次的命令。所以连续回车就可以了)

list + filename
list可简写为l
l+n(行号) — 具体到行开始到第10行结束的查看

查具体的行

list + filename:n
等价
l + filename:n

查看函数的上下文,而不是从main开始10行

l + main

查具体的函数

list + filename:main
等价
l + filename:main

断点

break point
break
b
等价
b + n(行号)(不能连续b+ n n)
b + filename:n

查看断点的标记或顺序信息

info b
简写
i b

去掉断点

delete + num(info b查看的断点序号)
简写
d + num

运行程序

run
简写为r
r

断点禁用/失能

disable + num

使能断点

enable + num

逐过程调试

next/简写n

逐语句/单步调式

step/s

调试自动监视窗口

print/p + 变量/地址

常显示调试监视信息

dislpay + 变量/地址

关闭常显示的监视变量

undisplay + 变量的编号

gdb调试工具的本质就是方便思考梳理思路逻辑,或者找bug、分析问题,自己解决。
其次,断点的本质就是跳过不必要的代码段,跳至下一个断点处,是缩小问题出现的范围。

当前位置/当前断点,直接跳至下一个断点处

continue/简写:c

运行到所在函数的结束位置

finish

跳转任意位置

until + n(行号)

补充:
1.查看断点的标记或顺序信息

info b

2.查看进程信息

info i

3.查看临时变量内容

info local

4.在gdb中快速的修改变量的值

set var + i=10(变量的值)

5.查看调用堆栈

bt

猜你喜欢

转载自blog.csdn.net/m0_69455439/article/details/136764356