1. Linux软件包管理器 yum
1.1 什么是软件包
在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序。但这样做太麻烦了,于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成Windows中的软件安装包)放在一个云服务器上,通过包管理器yum就可以获得这些编译好的软件包,直接进行安装。
yum (Yellow dog Updater , Modified) 是Linux下非常常用的一种包管理器,主要应用于Fedora,RedHat,Centos等发行版本上。
关于rzsz
这个工具用于Windows机器和远端Linux机器通过Xshell传输文件,安装完毕之后可以通过拖拽的方式将文件上传过去
注意事项
关于yum的所有操作必须保证主机网络畅通,可以用ping指令验证
查看软件包
通过yum list可以罗列出当前一共有哪些软件包,由于包的数目可能非常多,因此我们可以用grep或less命令查看
注意:
软件包名称: 主版本号.次版本号.源程序发行号-软件包的发行号.主机平台.cpu架构.
"x86_64" 后缀表示64位系统的安装包, "i686" 后缀表示32位系统安装包. 选择包时要和系统匹配.
"el7" 表示操作系统发行版的版本. "el7" 表示的是 centos7/redhat7. "el6" 表示 centos6/redhat6.
最后一列, base 表示的是 "软件源" 的名称, 类似于 "小米应用商店", "华为应用商店" 这样的概念
1.2 如何安装软件
安装软件我们都会,但是这里要提醒一下,因为软件一般都是安装到 /usr/ 的某个路径下,而这个路径是只有root有权限写入的,因此安装软件时要以root身份安装,可以选择sudo或直接使用root账号安装
··············································
出现 complete 字样,说明安装完成
如果安装命令中不带 -y 选项,安装时可能就需要我们手动按 y 确认哪些软件包要安装。
1.3 如何卸载软件
一句命令
这个也可以加 -y 选项,防止询问
1.4 yum下载原理及yum源配置
yum 在下载的时候我们并没有去指定下载源,所有Linux软件都是在不同的云服务器上,那yum命令是如何知道到底该去哪个服务器上找这个软件呢?
这是因为yum背后有它的一个配置文件,这个配置文件中会记录这些软件的下载路径。就像我们更新某些手机软件的时候,这个软件并不是通过应用商店更新的,而是直接弹到浏览器上给你下载安装,那这个软件的更新系统怎么知道要从哪个网址上下载新版本的呢,也是因为有配置文件的存在,这个配置文件中记录了要更新的地址。
yum的配置文件路径一般在 /etc/yum.repos.d/
这些都是yum的配置文件,我们只需要看第一个 -Base 的那个。
这里我们进这个配置文件看看
可以看到这里面都是些网址,这就是各个软件的下载地址了。
因为我的这个系统是在华为云上买的云服务器,所以这些网址也都是华为云服务器中提供的。这些网址的提供商可能因为你这个系统从不同的地方搞到的,网址的提供商都会有所不同。
这个 CentOS-Base.repo 叫 yum源文件 ,里面的这些内容叫 yum源 因为yum要通过这些内容找到并下载软件,过程就是yum会根据自己系统的版本在那些蓝色的语句中一替换,然后在跟上白色的下载路径,最后形成一条下载链接,于是就可以把对应的软件从云上下载下来了。
如果不喜欢现在的yum源可以进行切换。
首先搜一下都有啥yum源,这个要选择国内的源,要是国外的可能下载特别慢或下载不了的问题。这种东西一搜就能搜到。
这里用阿里云的yum源举例,我的系统是CentOS-7的所以就选择对应的yum源
复制链接地址,然后进入Linux系统
把刚刚的链接wget弄进去,回车下载就有了这样一个文件,我们可以vim打开它看看
这里就是阿里云的yum源了,但是现在它们还没有生效,我们可以把之前的yum源文件备份一下防止出问题,然后把新yum源mv过去,再把名字改成老yum源的名字,就比如我这里就是CentOS-Base.repo 然后使用 yum clean all 清理一下缓存 yum makecache 重建yum缓存
然后我们下载东西就是用阿里云的镜像源下载了。
2. Linux编辑器 - vim的使用
2.1 vim的基本概念
vim有三种常用模式,分别是 命令模式(command mod) 、插入模式(insert mode) 、底行模式(last line mode) ,各模式的功能区分如下:
命令模式:
控制屏幕光标的移动,行或字符的删除,移动复制某区段。刚进入vim时默认在命令模式 的,在命令模式下按 "i" 进入插入模式 ,按 ":" 进入底行模式
插入模式:
输入文字,用于编写代码,按 "ESC" 返回命令模式
底行模式:
文件保存或退出,也可以进行文件替换,找字符串,set nu展示行号。在命令模式下敲出 **":"**即可进入底行模式,要查看所有模式可以输入 :help vim-modes
2.2 vim的基本操作
我们创建一个文件,然后用vim进入它
刚进入时是这个状态,现在就是命令模式
我们按 i 进入插入模式
这个时候我们才能输入文字
然后按 ESC 退出插入模式,回到命令模式,再输入 : 进入底行模式
输入 w(保存)q(退出) 回车就可以保存并退出了
出来之后我们可以cat看一下文件确实被写入了
2.2.1 vim命令模式命令集
插入模式
i 进入插入模式,从光标当前位置开始输入文件
a 进入插入模式,从目前光标的下一个位置开始输入文字
o 进入插入模式,在下一行插入新的一行并开始插入文字
移动光标
vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、「l」,分别控制光标左、下、上、右移一格
按「G」:移动到文章的最后
按「 $ 」:移动到光标所在行的"行尾"
按「^」:移动到光标所在行的"行首"
按「w」:光标跳到下个单词的开头
按「e」:光标跳到下个单词的字尾
按「b」:光标回到上个单词的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:进入到文本开始
按[#+G]:进入第#行,如50G
按「ctrl」+「b」:向"上"移动一页
按「ctrl」+「f」:向"下"移动一页
按「ctrl」+「u」:向"上"移动半页
按「ctrl」+「d」:向"下"移动半页
删除文字
x :每按一次,删除光标所在位置的一个字符
#x :例如,「6x」表示删除光标所在位置的"后面(包含自己在内)"6个字符
X :大写的X,每按一次,删除光标所在位置的"前面"一个字符
#X :例如,「20X」表示删除光标所在位置的"前面"20个字符
dd :删除光标所在行
#dd :从光标所在行开始删除#行
复制
yw :将光标所在之处到字尾的字符复制到缓冲区中。
#yw :复制#个字到缓冲区
yy :复制光标所在行到缓冲区。
#yy :例如,「6yy」表示拷贝从光标所在的该行"往下数"6行文字。 dd :剪切光标所在行
#dd :从光标所在行开始剪切#行
p :将缓冲区内的字符贴到光标所在位置。注意:所有与"y"有关的复制命令都必须与"p"配合才能完成复制与粘贴功能。
替换
r :替换光标所在处的字符。
R :替换光标所到之处的字符,直到按下「ESC」键为止 (替换模式)
~ :大小写快速切换
撤销上次操作
u :如果您误执行一个命令,可以马上按下「u」,回到上一个操作。按多次"u"可以执行多次回退。
ctrl + r : 撤销的恢复
更改
cw :更改光标所在处的字到字尾处
c#w :例如,「c3w」表示更改3个字
跳出指定的行
ctrl + g :列出光标所在行的行号。
#G :例如,「15G」,表示移动光标至文章的第15行行首。
2.2.2 vim底行模式命令集
列出行号
set nu : 输入「set nu」后,会在文件中的每一行前面列出行号。
跳到文件中的某行
:「#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15,再回车,就会跳到文章的第15行
查找字符
/关键字 : 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往后寻找到您要的关键字为止。
?关键字 :先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按「n」会往前寻找到您要的关键字为止。
保存文件
w : 在冒号输入字母「w」就可以将文件保存起来
分屏操作
vs + 文件名:分屏操作
Ctrl + w :光标换屏,换到哪个屏操作哪个文件
离开vim
q :按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim。
wq :一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。
ZZ :wq快捷键
q! : 强制退出
! + 命令 :暂时出vim执行命令,执行好之后回到vim
我们将vim编辑好之后,回车在外面执行一下编译
此时出现回车继续的提示,我们就回车继续编写vim
可以查看到这个新编译出来的文件,然后我们继续回车
成功执行了代码。
也就是说我们可以在不退出vim的情况下对代码进行编写,编译,运行。
2.2.3 vim视图模式命令
试图模式就是进行批量操作,或者说块操作
Crtl + v :进入视图模式
h j k l :移动光标框选区域
I(大写i) :块填写
d :块删除
2.3 简单vim配置
我们回到家目录,查看隐藏文件,查看一个叫 .vimrc 的文件,如果没有就自己新建一个
然后我们vim进这个配置文件
在里面设置一下set nu然后保存退出
现在我们再进vim的时候就不用我们手动呼出行号了。
vim在启动的时候会默认先读取一下这个 .vimrc 配置文件,也就是说,如果我们想给vim配置什么就往这个文件中添加就好了。
因为这个配置文件是配置在每个人的家目录下的,所以谁用vim打开的文件,那么就会去读谁的配置文件,就比如张三还没有配置vim,但是我用vim去打开他家中的文件时也是有行号的,但是他来打开我的文件就不会有行号。
关于vim再配置点啥的可以上网上看看。
这里提供一份vim配置成C++IDE的方法
使用普通用户输入以下指令,不要使用root账户:
curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh
卸载方法:
bash ~/.VimForCpp/uninstall.sh
配置好了之后被配置的这个用户的家目录下会有一个 install.sh 的文件这个文件不要删。
3. Linux编译器 gcc / g++ 的使用
gcc和g++的选项操作都是一样的,我之后统一使用gcc举例。
如果没有安装g++就在root身份下安装 gcc-c++ 软件即可
3.1 背景知识
一个程序从代码变成可执行程序中间要经历下面四个步骤:1. 预处理(进行宏替换) 2. 编译(生成汇编) 3. 汇编(生成机器可识别的代码) 4. 链接(生成可执行文件)
预处理阶段编译器主要进行,宏替换,文件包含,条件编译,去注释的处理,预处理指令都是 # 开头的代码行。选项 -E 会使gcc在预处理结束后停止编译过程
编译阶段编译器首先要检查代码的规范性,是否有语法错误等,无误后gcc把代码翻译成汇编语言。选项 -S 只进行编译而不进行汇编,只生成汇编代码
汇编阶段把编译阶段生成的.s文件转成目标文件。选项 -c 可以看到汇编代码将会转化成 .o 的二进制目标代码了
链接阶段最后生成可执行程序,选项 -o 为生成的文件命名
3.2 语法与选项
语法:
gcc [选项] 要编译的文件 [-o] 完成编译后的新文件
g++ [选项] 要编译的文件 [-o] 完成编译后的新文件
-o选项的用途就是为编译出来的新文件重命名的,如果不需要重命名的话 -o 和它后面的东西就都不用写了。
我们先用vim写个code.c文件出来
我这个vim就是已经用上面那个链接配置好了的
3.2.1 -E 预处理生成 .i文件
我们使用-E选项,命令编译器拿着代码只完成预处理就停下来生成一个 .i 文件。
这一步需要我们自己-o设定新文件的名字,否则直接 gcc -E code.c 是不会生成文件的,而是将预处理的整个过程刷屏。
下面我们vim进这个文件看看预处理之后的代码长什么样子
上面都是声明、typedef等预处理内容,并且这些还都是c语言,我们直接翻到最后可以看到宏已经被替换了。
3.2.2 -S 编译生成汇编 .s 文件S
使用 -S(大写) 选项让编译器完成编译后就停下来,生成一个 .s 文件
这里我们可以不用指定新文件名称了,编译器会自己搞
我们直接把预处理好的文件拿给编译器去编译,省的编译器再从头来一遍。
下面我们 vim 打开 这个新文件
可以看到现在已经变成汇编代码了。
3.2.3 -c 汇编生成二进制 .o 文件
使用 -c 选项让编译器完成汇编后就停下来,生成一个 .o 文件
vim打开看看
现在就是一堆乱码了,也就是说这已经是个二进制文件了。
但此时这个二进制文件是不可执行的,不仅仅是因为权限,就算更改了权限这个文件也无法执行,因为它还没有和库链接,这个程序还不完整。
3.2.4 链接生成可执行文件
链接是没有选项的,gcc会自己完成这个操作,我们只需要给新文件改个名就行,甚至不改名让它自己生成一个名字也行
现在彻底完成了广义上的编译器的编译生成可执行文件的过程,但是在实际应用的时候不用我们这样一个一个文件的生成,直接用最后这句 gcc code.o -o code.exe 一部到位。
3.3 链接的过程
我们可以通过 ldd 命令看到一个可执行程序需要链接的库
第一个和第三个不用看,我们直接看第二个库,这个可执行程序依赖一个叫 libc.so.6 的库,然后我们进入这个库的目录看看,可以看到这个库是C标准库中的内容。
上我们还可以去看看Linux命令需要的库
可以看到 ls命令 这里也链接了这个C的库,其他命令也是如此,由此我们可以得知Linux中的命令都是由C语言写的了。
3.3.1 动态库与静态库
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此在运行的时候就不需要链接别的库了,但如果这么做生成的文件就会比较大。其后缀名一般为 .a
动态库在编译链接时,不将库文件代码加入,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销,同时生成的可执行文件较小,但是一旦动态库出现问题那所有链接这个库的文件都要出问题。动态库后缀名一般为 .so
在windows中,动态库链接出来的文件一般以 .dll 结尾,静态库链接出来的文件一般以 .lib 结尾。
链接动态库的行为叫动态链接 ,链接静态库的行为叫静态链接
我们可以通过 file 文件名 指令查看到文件的链接属性
可以查看一下刚刚我们生成的code.exe文件,这里可以看到是动态链接属性
gcc编译器是默认进行动态链接的,如果想要静态链接需要在链接命令后面加 -static 选项
如果链接失败了说名没有装静态库,用两句代码装上就好
sudo yum install -y glibc-static sudo yum install -y libstdc++-static
装好后我们再用静态链接生成一下
可以看到静态链接的文件比动态链接的文件大了很多,这还只是链接了stdio.h一个库的状态,可以想象静态链接的文件是巨大的。