3.Linux工具(1)
文章目录
- 3.Linux工具(1)
-
-
- [Linux 软件包管理器 yum](#Linux 软件包管理器 yum)
-
- 什么是软件包
- [关于 rzsz](#关于 rzsz)
- [查看软件包------yum list命令](#查看软件包——yum list命令)
- 如何安装软件
- 如何卸载软件
- 补充------yum如何找到要安装软件的下载地址
- Linux开发工具
- Linux编译器-gcc/g++使用
-
Linux 软件包管理器 yum
什么是软件包
- 在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
- 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
- 软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
- yum(Yellow dog Updater, Modified)是Linux下非常常用的一种包管理器. 主要应用在Fedora, RedHat,Centos等发行版上.
关于 rzsz
这个工具用于 windows 机器和远端的 Linux 机器通过 XShell 传输文件,安装完毕之后可以通过拖拽的方式将文件上传过去.
- 注意事项
关于 yum 的所有操作必须保证主机(虚拟机)网络畅通!!!
可以通过 ping 指令验证
查看软件包------yum list命令
通过 yum list 命令可以罗列出当前一共有哪些软件包. 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包. 例如:
bash
[root@hcss-ecs-b735 dir2]# yum list | grep gcc-c++
gcc-c++.x86_64 4.8.5-44.el7 @base
avr-gcc-c++.x86_64 4.9.2-1.el7 epel
gcc-c++-aarch64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-alpha-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-arm-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-avr32-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-bfin-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-c6x-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-cris-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-frv-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-h8300-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-hppa-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-hppa64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
gcc-c++-ia64-linux-gnu.x86_64 4.8.5-16.el7.1 epel
注意:
- 软件包名称: 主版本号、次版本号、源程序发行号、软件包的发行号、主机平台、cpu架构
x86_64
后缀表示64位系统的安装包,i686
后缀表示32位系统安装包. 选择包时要和系统匹配.el7
表示操作系统发行版的版本,el7
表示的是centos7/redhat7
.el6
表示centos6/redhat6
.- 最后一列,
base
表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念.
如何安装软件
通过 yum, 我们可以通过很简单的一条命令完成 gcc-c++ 的安装.
bash
[root@hcss-ecs-b735 dir2]# yum install -y gcc-c++ #主要看这里
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfile
Resolving Dependencies
--> Running transaction check
---> Package gcc-c++.x86_64 0:4.8.5-44.el7 will be installed
--> Processing Dependency: libstdc++-devel = 4.8.5-44.el7 for package: gcc-c++-4.8.5-44.el7.x86_64
--> Running transaction check
---> Package libstdc++-devel.x86_64 0:4.8.5-44.el7 will be installed
--> Finished Dependency Resolution
Dependencies Resolved
=============================================================================================
Package Arch Version Repository Size
=============================================================================================
Installing:
gcc-c++ x86_64 4.8.5-44.el7 base 7.2 M
Installing for dependencies:
libstdc++-devel x86_64 4.8.5-44.el7 base 1.5 M
Transaction Summary
=============================================================================================
Install 1 Package (+1 Dependent package)
Total download size: 8.7 M
Installed size: 25 M
Downloading packages:
(1/2): libstdc++-devel-4.8.5-44.el7.x86_64.rpm | 1.5 MB 00:00:00
(2/2): gcc-c++-4.8.5-44.el7.x86_64.rpm | 7.2 MB 00:00:00
---------------------------------------------------------------------------------------------
Total 33 MB/s | 8.7 MB 00:00:00
Running transaction check
Running transaction test
Transaction test succeeded
Running transaction
Installing : libstdc++-devel-4.8.5-44.el7.x86_64 1/2
Installing : gcc-c++-4.8.5-44.el7.x86_64 2/2
Verifying : gcc-c++-4.8.5-44.el7.x86_64 1/2
Verifying : libstdc++-devel-4.8.5-44.el7.x86_64 2/2
Installed:
gcc-c++.x86_64 0:4.8.5-44.el7
Dependency Installed:
libstdc++-devel.x86_64 0:4.8.5-44.el7
Complete! #主要看这里
yum 会自动找到都有哪些软件包需要下载, 这时候敲 "y" 确认安装.(我这里由于使用了-y选项所以不需要再次确认来继续安装)
出现 "complete" 字样, 说明安装完成.
注意事项:
- 安装软件时由于需要向系统目录中写入内容, 一般需要 sudo 或者切到 root 账户下才能完成.
- yum安装软件只能一个装完了再装另一个. 正在yum安装一个软件的过程中, 如果再尝试用yum安装另外一个软件, yum会报错.
如果 yum 报错, 请自行百度.
如何卸载软件
仍然是一条命令:
bash
yum remove [软件名]
补充------yum如何找到要安装软件的下载地址
当我们在使用yum下载软件的时候我们会发现,我们并不需要向yum提供详细的软件下载地址就可以直接通过软件名下载这个软件。这是因为yum有相应的配置文件,这个配置文件里面会记录yum其他软件有关的下载路径
bash
[root@hcss-ecs-b735 dir2]# ls /etc/yum.repos.d/
CentOS-Base.repo CentOS-fasttrack.repo CentOS-Vault.repo epel.repo.rpmnew
CentOS-CR.repo CentOS-Media.repo CentOS-x86_64-kernel.repo epel-testing.repo
CentOS-Debuginfo.repo CentOS-Sources.repo epel.repo
对于如何切换yum源以及如何对虚拟机上的Linux系统配置yum源,可以在网上进行搜索。在网上找到yum源、直接下载在Linux服务器中的yum源配置文件位置
bash
#!/bin/bash
## 备份 /etc/yum.repos.d/CentOS-Base.repo
sudo cp /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
## 更换为阿里源
sudo curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
## 安装epel
sudo yum install -y epel-release
## 使用阿里提供的epel源
sudo curl -o /etc/yum.repos.d/epel-7.repo http://mirrors.aliyun.com/repo/epel-7.repo
## 清空yum缓存
sudo yum clean all
## 重建yum缓存
sudo yum makecache
Linux开发工具
Linux编辑器-vim使用
vim是一个多模式的编辑器,不是编译器(不能编译代码)
1.vim的基本概念
vim有很多种模式但这里只简要介绍三种最常用的模式,三种模式分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode),各模式的功能区分如下:

-
正常/普通/命令模式(Normal mode)
控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
-
插入模式(Insert mode)
只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
-
末行模式(last line mode)
文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入
2.vim的基本操作
vim的操作指令有点多,其实不需要刻意去记忆,用的多了自然就记住了,这里简单列举几个
1. 模式切换
按 Esc
退出其他模式。(进入正常模式)
正常模式\]切换至\[插入模式
-
i
:光标前插入 这个用的最多 -
I
:行首插入 -
a
:光标后插入 -
A
:行尾插入 -
o
:下方新建行插入 -
O
:上方新建行插入 -
v
:字符选择 -
V
:行选择 -
Ctrl+v
:块选择 -
正常模式\]切换至\[末行模式
「shift + ;」, 其实就是输入「:」
2. 光标移动
-
h
← /j
↓ /k
↑ /l
→ 这个基本不用,用键盘上的上下左右键就可以 -
0
:行首 /^
:第一个非空字符 -
$
:行尾 -
gg
:文件开头 -
G
:文件末尾 -
5G
或:5
:跳转到第5行 -
Ctrl+f
:向下翻页 /Ctrl+b
:向上翻页 -
%
:跳转到匹配的括号(如{}
,()
) -
w
光标移动到下一个单词(连续英文字符串) -
b
光标移动到上一个单词(连续英文字符串)
3. 文本编辑
-
shift + r
:进入替换模式,需要用EXC
退回正常模式 -
x
:删除光标指向的字符 -
shift + ~
:大小写切换 -
shift + x
:删除光标之前的字符 -
dw
:删除到单词结尾 -
dd
:删除整行(应该算是一种剪切) -
3dd
:删除3行 -
d$
:删除到行尾 -
yy
:复制当前行 -
3yy
:复制3行 -
p
:粘贴到光标后 /P
:粘贴到光标前 -
u
:撤销 -
Ctrl+r
:重做
4. 搜索与替换
-
/keyword
:向下搜索(注意这个ketword
是你要找的字符) -
?keyword
:向上搜索 -
n
:下一个匹配 /N
:上一个匹配 -
:s/old/new
:替换当前行第一个匹配 -
:s/old/new/g
:替换当前行所有匹配 -
:%s/old/new/g
:替换全文所有匹配 -
:%s/old/new/gc
:替换时逐个确认
5. 保存与退出
:w
:保存:q
:退出:wq
或:x
:保存并退出:q!
:强制退出(不保存):w!
:强制写入wq!
:强制保存并退出ZZ
(Shift+z+z):快速保存退出
6. 分屏与标签页
-
:sp [file]
:水平分屏 -
:vsp [file]
:垂直分屏 -
Ctrl+w + 方向键
:切换分屏 -
:tabnew
:新建标签页 -
gt
:下一个标签 /gT
:上一个标签
7. 其他实用命令
-
>>
:当前行右缩进 /<<
:左缩进 -
gg=G
:自动缩进全文(适合代码) -
:set number
(:set nu
):显示行号 -
:set nowrap
:禁止自动换行 -
:help [command]
:查看帮助(如:help :w
)
8. 可视模式操作
- 选中文本后:
y
:复制选中内容d
:删除选中内容>
:向右缩进 /<
:向左缩进- 块模式下按
I
插入内容,按Esc
应用到所有
9.在vim中编译、执行代码
-
:!gcc
:与之前的gcc 用法是一样的 -
:./[可执行文件名]
:执行当前文件夹中的可执行文件 -
:!
可以执行命令行命令,路径为当前vim打开的文件路径 -
vs + 其他文件名
:打开其他文件支持分屏操作
3.简单vim配置
在网上有许多教我们如何配置vim的教程,我这里就用一个比较简单的方式来进行配置。
- 安装方法
在 shell 中执行指令(想在哪个用户下让vim配置生效, 就在哪个用户下执行这个指令. 强烈 "不推荐" 直接在 root 下执行):
bash
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
需要按照提示输入 root 密码. 您的 root 密码不会被上传, 请放心输入.
- 卸载方法
在安装了 VimForCpp 的用户下执行:
bash
bash ~/.VimForCpp/uninstall.sh
Linux编译器-gcc/g++使用
1.背景知识
预处理(进行宏替换)
编译(生成汇编)
汇编(生成机器可识别代码)
连接(生成可执行文件或库文件)
这个内容在C语言学习的时候就已经了解过了,可以去搜索一下
2.gcc如何完成
格式:gcc [选项] 要编译的文件 [选项] [目标文件]
预处理(进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。预处理指令是以#号开头的代码行。
实例:gcc --E hello.c --o hello.i
选项"-E",该选项的作用是让 gcc 在预处理结束后停止编译过程。选项"-o"是指目标文件,".i"文件为已经过预处理的C原始程序。
编译(生成汇编)
在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
用户可以使用"-S"选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
实例:gcc --S hello.i --o hello.s
汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的".s"文件转成目标文件
可使用选项"-c"就可看到汇编代码已转化为".o"的二进制目标代码了
实例:gcc -c code.s -o code.o
连接(生成可执行文件或库文件)
在成功编译之后,就进入了链接阶段。
实例:gcc hello.o -o hello
动态库
在这里涉及到一个重要的概念:函数库。我们的C程序中,并没有定义"printf"的函数实现,且在预编译中包含的"stdio.h"中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实"printf"函数的呢?
最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径"/usr/lib"下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数"printf"了,而这也就是链接的作用
函数库一般分为静态库和动态库两种
-
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为".a"。在Windows版本中的动态库是
.lib
结尾的文件 -
把码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为".so",如前面所述的 libc.so.6 就是动态库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如
gcc hello.o -o hello
。还有一个可以提一点的是,在Windows版本中的动态库是.dll
结尾的文件 -
gcc默认生成的二进制程序,是动态链接的,这点可以通过 命令验证。
动态库、动态链接、静态库与静态链接的对比总结
1. 定义
概念 | 说明 |
---|---|
动态库 | 运行时加载的共享库(如 .dll 、.so ),不嵌入程序,可被多个进程共享。 |
动态链接 | 在程序运行时 将动态库绑定到进程的过程(自动加载或手动 dlopen )。 |
静态库 | 编译时嵌入程序的库(如 .lib 、.a ),代码直接合并到可执行文件中。 |
静态链接 | 在程序编译时将静态库代码复制到可执行文件中,生成独立文件。 |
2. 特点
特性 | 动态库/动态链接 | 静态库/静态链接 |
---|---|---|
文件大小 | 程序体积小(仅自身代码) | 程序体积大(包含所有依赖库代码) |
内存占用 | 低(多个程序共享同一库) | 高(每个程序独立加载库代码) |
更新维护 | 替换库文件即可生效 | 需重新编译程序 |
依赖管理 | 需处理库版本冲突(依赖地狱) | 无外部依赖,独立运行 |
加载时机 | 运行时加载(延迟绑定) | 编译时嵌入 |
适用场景 | 通用软件、系统级程序(如 glibc ) |
嵌入式系统、独立工具(如 busybox ) |
3. 优缺点对比
动态库与动态链接
- 优点 :
- 节省内存和磁盘空间(共享性)。
- 支持热更新(无需重新编译程序)。
- 灵活加载(如插件系统)。
- 缺点 :
- 依赖外部环境(库缺失或版本冲突会导致程序崩溃)。
- 首次调用函数时可能有解析延迟(PLT/GOT 机制)。
静态库与静态链接
- 优点 :
- 程序独立,无需外部依赖。
- 启动速度快(无运行时加载开销)。
- 避免依赖地狱。
- 缺点 :
- 文件体积大(代码冗余)。
- 更新需重新编译分发。
- 内存占用高(多进程无法共享库代码)。
6. 总结
- 动态库与动态链接 :
通过共享代码 和按需加载优化资源利用,适合通用软件和灵活扩展,但需管理依赖和版本。 - 静态库与静态链接 :
以空间换独立性,适合对部署环境要求严格的场景(如嵌入式系统),但牺牲了更新便利性。
注意:
- 在操作系统中一般默认使用的是动态链接,但我们在编译的时候可以指定用静态链接,也就是下面gcc的
-static
选项 - 我们可以用
file
命令查看一个程序的详细信息,包括它是静态链接和动态链接 - 云服务器可能没有安装静态库,去搜索安装
gcc选项
-E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面
-S 编译到汇编语言不进行汇编和链接
-c 编译到目标代码
-o 文件输出到 文件
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared 此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库.
-O0
-O1
-O2
-O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高-w 不生成任何警告信息。
-Wall 生成所有警告信息。
gcc选项记忆
esc,iso例子。我们一般用的时候都是直接将C语言文件通过gcc hello.c -o hello
直接编译成可执行文件。不需要逐步生成各种中间文件。