【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

相关推荐
内核程序员kevin30 分钟前
TCP Listen 队列详解与优化指南
linux·网络·tcp/ip
冰帝海岸2 小时前
01-spring security认证笔记
java·笔记·spring
小二·4 小时前
java基础面试题笔记(基础篇)
java·笔记·python
朝九晚五ฺ5 小时前
【Linux探索学习】第十四弹——进程优先级:深入理解操作系统中的进程优先级
linux·运维·学习
自由的dream5 小时前
Linux的桌面
linux
xiaozhiwise5 小时前
Makefile 之 自动化变量
linux
wusong9996 小时前
mongoDB回顾笔记(一)
数据库·笔记·mongodb
猫爪笔记6 小时前
前端:HTML (学习笔记)【1】
前端·笔记·学习·html
Resurgence037 小时前
【计组笔记】习题
笔记