【Linux的 yum_vim工具篇】

Linux学习笔记---004

  • Linux的yum_vim工具篇
    • 1、Linux软件包管理器yum
      • 1.1、yum是什么?
      • 1.2、软件包是什么?软件包是谁给提供的呢?
      • 1.3、Linux系统(其中的centos 7)生态
    • 2、yum的相关操作
      • 2.1、yum基本指令格式
      • 2.2、软件源
    • 3、yum的本地配置
      • 3.1、配置将来是干什么的?
      • 3.2、那么如何配置?
    • 4、vi/vim编辑器
      • 4.1、vim概念和模式介绍
      • 4.2、各个模式的常用项
    • 5、gcc/g++编译器
      • 5.1、安装:g++
      • 5.2、编译步骤
      • 5.3、程序的基本编译过程
      • 5.4、其中命令行可输入宏
      • 5.5、编译器的自举过程
    • 6、动静态链接
      • 6.1、链接过程是什么?什么是静动态库?
      • 6.2、为什么要有链接这步骤?为什么要有库?
      • 6.3、静动态库总结
    • 7、make/Makefile自动化构建工具
      • 7.1、makefile的简单应用
      • 7.2、依赖关系,依赖方法
      • 7.3、make和makefile的原理
    • 8、Linux的调试工具gbd
      • 8.1、背景
      • 8.2、基本使用方法和gbd指令
      • 8.3、gdb的使用

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/749866.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Lua-Lua与C++的交互2

Lua与C的交互是指在C程序中使用Lua本语言,或者在Lua脚本中调用C代码的过程。这种交互可以实现C与Lua之间的数据传递和函数调用。 在C中与Lua交互的主要步骤如下: 引入Lua库:首先需要在C程序中引入Lua的头文件和库文件,以便能够使…

pytorch中张量变换函数

在PyTorch中view(), transpose() 和 permute() 函数都是用于改变张量(Tensor)维度结构的,但它们的作用和使用场景有所不同。 torch.view() 功能:该函数用于将一个张量重塑为新的形状,但它必须保持原有元素数量不变。它…

【MASM汇编语言快速入门】8086MASM汇编深入理解指令对标志位的影响

8086MASM汇编深入理解指令对标志位的影响 文章目录 8086MASM汇编深入理解指令对标志位的影响0. 指令对标志位影响1. 指令对标志位影响速查表2. flags标志寄存器: 标志位含义解读flags1. 状态标志cf, pf, af, zf, sf, of2. 控制标志df, if, tf 详解:1. 传送指令2. 算…

如何在IDEA 中设置背景图片

在IDEA 中设置背景图片,可以按照以下步骤操作: 1、打开 IntelliJ IDEA 软件,进入代码编辑主界面。 点击编辑窗口上方的“File”菜单项。 2、在下拉子菜单中,选择“Settings”选项(如果你使用的是 macOS,可…

AUTOSAR汽车电子嵌入式编程精讲300篇-车载 CAN 总线延时特性分析及优化(续)

目录 3.1.2 通信错误恢复时间 3.2 延时指标研究 3.2.1 总线 Burst 情况 3.2.2 抖动

vue3子父组件之间的调用

子组件&#xff1a; capacityIndex.vue 父组件&#xff1a; index.vue A.子组件获取父组件属性 1.在父组件中引用子组件 import capacityIndex from "./capacityIndex"; <capacityIndex :tankInfo"tankInfo" :deviceNameInfo"deviceNameInfo…

Spark-Scala语言实战(1)

在之前的文章中&#xff0c;我们学习了如何在Linux安装Spark以及Scala&#xff0c;想了解的朋友可以查看这篇文章。同时&#xff0c;希望我的文章能帮助到你&#xff0c;如果觉得我的文章写的不错&#xff0c;请留下你宝贵的点赞&#xff0c;谢谢。 Spark及Scala的安装https:/…

【智能算法】保姆级教程-如何使用CEC测试集,以及如何定义自己的优化问题

目录 1.准备工作2.使用CEC2005测试集3.自定义优化问题-无约束问题4.自定义优化问题-有约束问题5.代码实现 1.准备工作 一个CEC2005测试集 一个测试智能算法&#xff0c;比如麻雀搜索算法SSA 2.使用CEC2005测试集 以CEC2005测试集函数F7为例&#xff1a; 3.自定义优化问题…

solr/ES 分词插件Jcseg设置自定义词库

步骤&#xff1a; 1、找到配置文件jcseg-core/target/classes/jcseg.properties修改配置&#xff1a; 下载地址: https://gitee.com/lionsoul/jcseg#5-如何自定义使用词库 lexicon.path {jar.dir}/../custom-word 设置lexicon路径&#xff0c;我们这个配置可以自定义&#xf…

python非常优秀的图结构处理框架

核心特点 多样性: 支持创建多种类型的图,如无向图、有向图、多重图等。 灵活性: 易于扩展和定制,支持自定义节点和边的属性。 易用性: 提供大量的算法和绘图工具,便于网络分析和可视化。 最佳实践 安装 Networkx: pip install networkx功能一:创建和操作图 标题:基础…

计算机网络-概述

文章目录 1.2 因特网概述1.2.1 网络、互连网&#xff08;互联网&#xff09;和因特网1.2.2 因特网发展的三个阶段1.2.4 因特网的组成 1.3 三种交换方式1.3.1 电路交换1.3.2 分组交换1.3.3 报文交换1.3.4 三种方式对比 1.4 计算机网络的定义1.5 计算机网络的性能指标1.5.1 速率1…

antd5 虚拟列表原理(rc-virtual-list)

github:https://github.com/react-component/virtual-list rc-virtual-list 版本 3.11.4(2024-02-01) 版本&#xff1a;virtual-list-3.11.4 Development npm install npm start open http://localhost:8000/List 组件接收 Props PropDescriptionTypeDefaultchildrenRender …

精读《手写 JSON Parser》

1 引言 JSON.parse 是浏览器内置的 API&#xff0c;但如果面试官让你实现一个怎么办&#xff1f;好在有人已经帮忙做了这件事&#xff0c;本周我们一起精读这篇 JSON Parser with Javascript 文章吧&#xff0c;再温习一遍大学时编译原理相关知识。 2 概述 & 精读 要解析…

(55)按身高排序

文章目录 每日一言1. 题目2. 解题思路2.1 使用冒泡排序2.2 使用qsort函数 3. 代码3.1 使用冒泡排序3.2 使用qsort函数 结语 每日一言 无论种子散落在何处&#xff0c;都会长出一棵树&#xff0c;向着天空&#xff0c;挣扎生长。 1. 题目 题目链接&#xff1a;按身高排序 给你…

【机器学习】分类模型的评价方法

&#x1f33b;个人主页&#xff1a;相洋同学 &#x1f947;学习在于行动、总结和坚持&#xff0c;共勉&#xff01; #学习笔记# 目录 一、混淆矩阵&#xff08;Confusion Matrix&#xff09; 二、评估指标&#xff08;Evaluation metrics&#xff09; 1.正确率(accuracy) …

R统计学3 - 数据分析入门问题41-60

往期R统计学文章: R统计学1 - 基础操作入门问题1-20 R统计学2 - 数据分析入门问题21-40 41. R 语言如何做双坐标图? # 创建模拟数据 year <- 2014:2024 gdp <- data.frame(year, GDP = sort(rnorm(11, 1000, 100))) ur <- data.frame(year, UR = rnorm(11, 5, 1…

计算机网络(7)----应用层

目录 一.应用层的基本概念 1.应用层的基本概述 2.网络应用模型 &#xff08;1&#xff09;客户/服务器模型 &#xff08;2&#xff09;P2P模型 二.应用程序相关 1.DNS系统 &#xff08;1&#xff09;域名与域名服务器 &#xff08;2&#xff09;域名解析过程&#xff…

2024 第一届VCTF 纳新赛 Web方向 题解WP

hackjs 题目描述&#xff1a;A baby oldjs, just warm up. 附件给源码 const express require(express) const fs require(fs) var bodyParser require(body-parser); const app express() app.use(bodyParser.urlencoded({extended: true })); app.use(bodyParser.json…

Python自动化测试之使用pytest-mock模拟用户输入

假如有这样一段代码要测试&#xff1a; # hello.py def welcome() -> str:name input("Whats your name? ").strip()if not name:return Welcome to Guangdong~return fHi, {name}. You are welcome! 测试代码可以这样写&#xff1a; # test_hello.py # pip …

CI/CD实战-git工具使用 1

版本控制系统 本地版本控制系统 集中化的版本控制系统 分布式版本控制系统 git官网文档&#xff1a;https://git-scm.com/book/zh/v2 Git 有三种状态&#xff1a;已提交&#xff08;committed&#xff09;、已修改&#xff08;modified&#xff09; 和 已暂存&#xff08;sta…