Linux学习笔记---004
- Linux的yum_vim工具篇
-
- 1、Linux软件包管理器yum
-
- 1.1、yum是什么?
- 1.2、软件包是什么?软件包是谁给提供的呢?
- [1.3、Linux系统(其中的centos 7)生态](#1.3、Linux系统(其中的centos 7)生态)
- 2、yum的相关操作
- 3、yum的本地配置
- 4、vi/vim编辑器
- 5、gcc/g++编译器
- 6、动静态链接
- 7、make/Makefile自动化构建工具
- 8、Linux的调试工具gbd
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