【Linux的 yum_vim工具篇】

Linux学习笔记---004

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

相关推荐
木子Linux25 分钟前
【Linux打怪升级记 | 问题01】安装Linux系统忘记设置时区怎么办?3个方法教你回到东八区
linux·运维·服务器·centos·云计算
mit6.82431 分钟前
Ubuntu 系统下性能剖析工具: perf
linux·运维·ubuntu
鹏大师运维33 分钟前
聊聊开源的虚拟化平台--PVE
linux·开源·虚拟化·虚拟机·pve·存储·nfs
watermelonoops40 分钟前
Windows安装Ubuntu,Deepin三系统启动问题(XXX has invalid signature 您需要先加载内核)
linux·运维·ubuntu·deepin
滴水之功2 小时前
VMware OpenWrt怎么桥接模式联网
linux·openwrt
ldinvicible2 小时前
How to run Flutter on an Embedded Device
linux
YRr YRr3 小时前
解决Ubuntu 20.04上编译OpenCV 3.2时遇到的stdlib.h缺失错误
linux·opencv·ubuntu
认真学习的小雅兰.3 小时前
如何在Ubuntu上利用Docker和Cpolar实现Excalidraw公网访问高效绘图——“cpolar内网穿透”
linux·ubuntu·docker
zhou周大哥3 小时前
linux 安装 ffmpeg 视频转换
linux·运维·服务器
Hejjon3 小时前
SpringBoot 整合 SQLite 数据库
笔记