软件包管理器

什么是软件包

•在Linux下安装软件,⼀个通常的办法是下载到程序的源代码,并进⾏编译,得到可执⾏程序,但是这样太⿇烦了,于是有些⼈把⼀些常⽤的软件提前编译好,做成软件包(可以理解成windows上 的安装程序)放在⼀个服务器上,通过包管理器可以很⽅便的获取到这个编译好的软件包,直接进⾏安 装.

• 软件包和软件包管理器,就好⽐"App"和"应⽤商店"这样的关系.

• yum(YellowdogUpdater,Modified)是Linux下⾮常常⽤的⼀种包管理器.主要应⽤在Fedora, RedHat, Centos等发⾏版上.

• Ubuntu:主要使⽤apt(AdvancedPackageTool)作为其包管理器。apt同样提供了⾃动解决依 赖关系、下载和安装软件包的功能。

Linux软件⽣态

Linux下载软件的过程(Ubuntu、Centos、other):

软件包服务器中的软件包源自开发人员或者社区中的一些好用的源码经过审核上传而来。

操作系统的好坏评估---⽣态问题

一些系统中的bug或者难用的功能会在社区论坛中找到,开发人员从而吸取经验不断优化系统。

yum

 yum具体操作

centos使用的软件安装包为yum,而ubuntu则是apt

查看软件包

通过yumlist命令可以罗列出当前⼀共有哪些软件包.由于包的数⽬可能⾮常之多,这⾥我们需要使⽤ grep 命令只筛选出我们关注的包.例如:

注意事项:

软件包名称:主版本号.次版本号.源程序发⾏号-软件包的发⾏号.主机平台.cpu架构.

"x86_64"后缀表⽰64位系统的安装包,"i686"后缀表⽰32位系统安装包.选择包时要和系统匹配.

"el7"表⽰操作系统发⾏版的版本."el7"表⽰的是centos7/redhat7."el6"表⽰centos6/redhat6.

最后⼀列,base表⽰的是"软件源"的名称,类似于"⼩⽶应⽤商店","华为应⽤商店"这样的概念.

Ubuntu有上述有详细介绍

安装软件

命令:yum install -y xxx

yum/apt会⾃动找到都有哪些软件包需要下载,这时候敲"y"确认安装.

出现"complete"字样或者中间未出现报错,说明安装完成.

注意事项:

安装软件时由于需要向系统⽬录中写⼊内容,需要root权限才能完成.

yum/apt安装软件只能⼀个装完了再装另⼀个.正在yum/apt安装⼀个软件的过程中,如果再尝试⽤ yum/apt安装另外⼀个软件,yum/apt会报错.

如果yum/apt报错,请⾃⾏百度.

安装一个好玩的命令:sl

yum install -y sl

更多好玩的命令:

命令 作用 安装方法(CentOS 7) 特点
sl 跑小火车 yum install -y sl 经典搞笑命令,输错 ls 才会出现
cowsay 奶牛说台词 yum install -y cowsay 可爱动物输出,还能换动物
fortune 随机名言 / 梗 yum install -y fortune 心情语录,搞笑又治愈
figlet 艺术大字 yum install -y figlet 把文字变成巨大字体艺术
toilet 彩色艺术字 yum install -y toilet 比 figlet 更炫,支持彩色 / 金属样式
hollywood 模拟黑客帝国 yum install -y epel-release yum install -y hollywood 屏幕疯狂刷屏,超像电影场景
cbonsai 种盆栽树 yum install -y epel-release yum install -y cbonsai 动态生长 bonsai,可加 -l 看慢动作
asciiquarium 终端水族馆 yum install -y epel-release yum install -y asciiquarium 鱼、水草、气泡全有,超治愈
cmatrix 黑客帝国代码雨 yum install -y cmatrix 绿色代码瀑布,经典终端特效
pipes.sh 管道流转动画 yum install -y epel-release yum install -y pipes.sh 彩色管道绕圈,按 q 退出
ninvaders 太空侵略者小游戏 yum install -y ninvaders 终端版打飞机,简单好玩
pacman4console 终端吃豆人 yum install -y pacman4console 经典游戏,方向键操作
oneko 小猫追鼠标 yum install -y oneko 小猫咪跟鼠标跑,超可爱
yes 无限重复输出 自带(无需安装) 比如 yes 666 刷屏,Ctrl+C
rev 反转文字 自带 输入什么就反向输出,比如 abc → cba

卸载软件

仍然是⼀条命令:

 yum remove [-y] lrzsz

注意事项

关于yum/apt的所有操作必须保证主机(虚拟机)⽹络畅通!!! 可以通过ping指令验证

ping www.baidu.com

编辑器Vim

vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所 有指令,⽽且还有⼀些新的特性在⾥⾯。例如语法加亮,可视化操作不仅可以在终端运⾏,也可以运 ⾏于xwindow、macos、windows,因此,接下来我们拿vim进行讲解。

vim的基本概念

vim的三种模式(其实有好多模式,⽬前掌握这3种即可),分别是命令模式(command mode)、插⼊模式(Insertmode)和底⾏模式(lastlinemode),各模式的功能区分如下:

模式名称 进入方式 主要功能 退出 / 切换方式 界面特征
命令模式(普通模式) 刚打开 Vim 默认就是按 Esc 从其他模式切回 移动光标、复制、粘贴、删除、撤销、查找 i → 插入模式按 : → 末行模式按 v → 可视模式 左下角无提示,只显示文件名 / 行数
插入模式(编辑模式) 命令模式下按:i / I / a / A / o / O 真正输入文字,像普通记事本 Esc → 回到命令模式 左下角显示 -- INSERT --
末行模式(底行模式) 命令模式下按 : 保存、退出、设置行号、搜索替换、执行 shell Esc → 回到命令模式执行命令后自动退回 最下方出现 : 等待输入指令

如果不清楚自己处于什么模式,可以多按几次 Esc 键,回到命令模式。

vim使⽤

进入vim命令:

vim :直接打开 Vim,进入空白文件。

vim  文件名:打开或新建该指定文件。

进⼊vim全屏幕编辑画⾯后vim默认处于命令模式,你要切换到插入模式才能够输入文字。

[普通模式]

普通模式中,默认只能移动光标,无法输入字符

移动光标:

vim可以直接⽤键盘上的光标来上下左右移动,但正规的vim是⽤英⽂字⺟「H」、「J」、 「K」、「L」,分别控制光标左、下、上、右移⼀格

^ 移动到行首

$ 移动到行尾

gg 移动到文件第一行

G 移动到文件最后一行

:n 移动到第 n 行(例如 :10 跳转到第 10 行)

删除:

x 删除光标所在字符

X删除光标所在位置的“前⾯”⼀个字符

dd 删除/剪切当前行

dw 删除一个单词(从光标到单词结尾)

复制:

yy 复制当前行

yw 复制一个单词

粘贴:

P 在光标前粘贴

p 在光标后粘贴

替换:

r替换光标所在处的字符

R替换光标所到之处的字符,直到按下「ESC」键为⽌

撤销上⼀次操作:

u回到上⼀个操作,按多次“u”可以执⾏ 多次回复。

ctrl+r撤销上一次的撤销(u)

注意:一但退出文件编辑,再进入时无法再撤销。如果只是保存,还能撤销。

查找

/关键词 向下查找关键词(按 n 跳转到下一个,N 跳转到上一个)

?关键词 向上查找

[普通模式]切换⾄[插⼊模式]

• 输⼊i:从光标当前位置开始输⼊⽂件;

•输⼊a:从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;

• 输⼊o:插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字。

[插⼊模式]切换⾄[普通模式]

⽬前处于[插⼊模式],就只能⼀直输⼊⽂字,如果发现输错了字,想⽤光标键往回移动,将该字删 除,可以先按⼀下「ESC」键转到[正常模式]再删除⽂字。当然,也可以直接删除。

[普通模式]切换⾄[末⾏模式]

「shift+; 」,其实就是输⼊「:」

退出vim及保存⽂件,在[普通模式]下,按⼀下「:」冒号键进⼊「Lastlinemode」,例如:

• :w(保存当前⽂件)

• :wq(输⼊「wq」,存盘并退出vim)/也可以ZZ

• :q(退出vim)

• :q!(输⼊q!,不存盘强制退出vim)

[普通模式]切换⾄[视图模式]

「shift+v 」

  • 先按 Esc 回到普通模式
  • 把光标移到你要删的那一列的第一行
  • Ctrl + v(进入列块选择模式,底部显示 VISUAL BLOCK
  • ↓ 方向键 选中整列(要删多少行就选多少行)
  • 直接按 dx这一列就一次性删掉了!

例如我要删除第一列的 “ 

简单vim配置

配置⽂件的位置

• 在⽬录/etc/下⾯,有个名为vimrc的⽂件,这是系统中公共的vim配置⽂件,对所有⽤⼾都有 效。 • ⽽在每个⽤⼾的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:“.vimrc”。例如,/root ⽬录下,通常已经存在⼀个.vimrc⽂件,如果不存在,则创建之。

• 切换⽤⼾成为⾃⼰执⾏ su ,进⼊⾃⼰的主⼯作⽬录,执⾏cd ~

•打开⾃⼰⽬录下的.vimrc⽂件,执⾏vim .vimrc

 常⽤配置选项,⽤来测试

• 设置语法⾼亮:syntaxon vim .vimrc

• 显⽰⾏号:setnu

• 设置缩进的空格数为4:setshiftwidth=4

要是觉得自己配麻烦的话这里给大家找到一个已经配置好的vim

安装方法:

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

注意:不能在root用户安装,只支持centos7,不支持ubantu,如果失败了就多试几次,因为这个文件比较大。

回到普通用户根目录下安装:cd ~

要输入root用户密码:

安装成功:

记得手动执行

卸载方法:

bash ~/.VimForCpp/uninstall.sh

结果:

编译器gcc/g++

如果是centos7最小化版本安装,默认不带gcc和g++,就需要自行安装:

//gcc
yum install -y gcc
//g++
yum install -y gcc-c++

代码运行的步骤:

1. 预处理(进⾏宏替换/去注释/条件编译/头⽂件展开等)

2. 编译(⽣成汇编)

3. 汇编(⽣成机器可识别代码)

4. 链接(⽣成可执⾏⽂件或库⽂件)

gcc [ 选项 ] 要编译的⽂件 [ 选项 ] [ ⽬标⽂件 ]

g++编译命令跟gcc一样。

下面我用一个test.c的文件来实验:

预处理

预处理功能主要包括宏定义,⽂件包含,条件编译,去注释等。

预处理指令是以#号开头的代码⾏。

示例:gcc –E test.c –o test.i

选项“-E”,该选项的作⽤是让gcc在预处理结束后停⽌编译过程。

选项“-o”是指⽬标⽂件,“.i”⽂件为已经过预处理的C原始程序。

编译

在这个阶段中,gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作, 在检查⽆误后,gcc把代码翻译成汇编语⾔。

⽤⼾可以使⽤“-S”选项来进⾏查看,该选项只进⾏编译⽽不进⾏汇编,⽣成汇编代码。

示例:gcc –S test.i –o test.s

汇编

汇编阶段是把编译阶段⽣成的“.s”⽂件转成⽬标⽂件。

在此可使⽤选项“-c”就可看到汇编代码已转化为“.o”的⼆进制⽬标代码了。

示例:gcc –c test.s –o test.o

链接

在成功编译之后,就进⼊了链接阶段。

示例:gcc test.o –o test

最后直接执行。

示例:./test

简单两步到位:

gcc test.c -o test
./test

或者

gcc test.c
./a.out

静态链接和动态链接

静态链接

在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂ 件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数, 但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则 需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。

静态链接特点:

  • 可执行文件体积大很多
  • 不依赖任何外部库,自己就能运行
  • 编译慢,占用空间

缺点

  • 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对 同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有 printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
  • 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程 序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在 执⾏的时候运⾏速度快。

如何静态链接?

gcc -static test.c -o test

查看是否静态链接

file test

显示 statically linked 就是静态链接。

动态链接

动态链接的出现解决了静态链接中的缺点。动态链接的基本思想是把程序按照模块拆分成各个相对 独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。动态链接其实远⽐静态链接要常⽤得多。

动态链接特点:

  • 可执行文件体积小
  • 多个程序可以共享同一个库(省内存)
  • 更新库只需要替换库文件,不用重新编译程序

缺点

  • 运行时依赖库文件,缺库就报错。
  • 程序迁移要带库,否则运行不了。

例子:

gcc test.c -o test

默认就是动态链接

查看是否动态链接

ldd test

能看到依赖的 .so(共享库)。

总结:

特性 静态链接 动态链接
库是否复制进可执行文件 ✅ 是 ❌ 否
可执行文件大小
运行是否依赖库 不依赖 依赖
程序迁移 方便(单独带可执行) 麻烦(要带库)
Linux 默认

静态库和动态库

静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运 ⾏时也就不再需要库⽂件了,其后缀名⼀般为“.a”。

动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由 运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库⼀般后缀名为“.so”。

gcc在编译时默认使⽤动态库。完成了链接之后,gcc就可以⽣成可执⾏⽂ 件,如下所⽰。

gcc hello.o –o hello

gcc默认⽣成的⼆进制程序,是动态链接的,这点可以通过file验证。

注意:

Linux下,动态库XXX.so,静态库XXX.a 

Windows下,动态库XXX.dll,静态库XXX.lib

⼀般我们的云服务器,C/C++的静态库并没有安装,可以采⽤如下⽅法安装:

#Centos
yum install glibc-static libstdc++-static -y

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐