Linux常用工具
本节内容
- 了解yum工具,进行软件安装
- vim编辑器适用,学会vim简单配置
- gcc/g++编译器,了解过程,原理
- 掌握简单gdb适用于调试
- 掌握简单的makefile编写,了解其运行思想
- 编写第一个Linux程序–进度条
- 了解git命令行的简单操作,传入github
工具分类
- 软件包管理工具—yum
- 个人编辑工具—vim(编辑器),gcc/g++(编译器),gdb(调试器)
- 项目的管理工具—make/Makefile(项目的自动化构建工具),git(项目的版本管理工具)
Linux软件包管理器 yum
什么是软件包?
- 在Linux下安装软件,一个通常的办法是下载到程序的源代码,并进行编译,得到可执行程序.
- 但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好,做成软件包(可以理解成windows上的安装程序)放在一个服务器上,通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.软件包和软件包管理器,就好比"App"和"应用商店"这样的关系.
- yum是Linux下非常常用的一种包管理器.主要应用在Fedora,RedHat,Centos等发行版上.
关于 rzsz(主机与虚拟机之间的文件传输工具)
- 在终端敲下rz,就会弹出一个小框框,这个工具用于windows机器和远端的Linux机器通过 XShell传输文件.安装完毕之后可以通过拖拽的方式将文件上传过去.
- 反之,敲下sz,是从虚拟机向windows主机传输文件,传文件的时候需要选择要传到哪里
查看软件包
- 通过 yum list 命令可以罗列出当前一共有哪些软件包.(默认去centos官方服务器去请求当前版本的centos能够安装哪些软件包),也可以使用yum search +关键字 去查找
- 由于包的数目可能非常之多, 这里我们需要使用 grep 命令只筛选出我们关注的包.
- eg: yum list | grep lrzsz(利用管道连接符)
如何安装软件
- 通过 yum, 我们可以通过很简单的一条命令完成 gcc 的安装.
- eg: yum install lrzsz
- yum 会自动找到都有哪些软件包需要下载, 这时候敲 “y” 确认安装.出现 “complete” 字样, 说明安装完成.
注意事项:
- 安装软件时由于需要向系统目录中写入内容,一般需要su或者切到root账户下才能完成.
- yum安装软件只能一个装完了再装另一个.,如果再尝试用yum安装另外一个软件,yum会报错.
如何查看已经安装了哪些安装包
- 使用yum list installed
如何卸载软件
- yum remove lrzsz(同样需要切换管理员用户)
Linux编辑器—vim使用
- vi/vim的区别简单点来说,它们都是多模式编辑器,不同的是vim是vi的升级版本,它不仅兼容vi的所有指令,而且还有一些新的特性在里面。例如语法加亮,可视化操作不仅可以在终端运行,也可以运行于x window、 mac os、windows。
- vim—命令行下的文本编辑工具
- 文本编辑:插入数据/复制/剪切/删除/保存/退出编辑,默认不支持鼠标操作/并且默认没有windonw下常用快捷键,比如ctrl+c,crtl+v
vim的模式(一共有12种操作模式,常用的3种)
- vim有多种不同的操作模式,不同的操作模式下某个按键的功能也会有所不同
- 正常/普通/命令模式—控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到lastlinemode(打开时候默认的模式,功能是完成文本内容的操作:—复制粘贴删除)
- 插入模式—只有在Insertmode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式
- 底行/末行模式—文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim,底行模式直接输入(文本的保存以及退出编辑)
- vim test.c (这个test.c可以不存在,vim会自动创建这个文件)–打开一个文件
模式之间的切换
- 普通模式到插入模式,使用i,但是使用i输入,是在当前光标所处的位置进行输入;也可以使用a,光标向后移动一个字符,然后开始插入,当然a的时候也可以随意挪动光标所在的位置;使用小写o,在光标所在行下方添加新行,开始插入.(有小写的iao,也有大写的IAO,功能可能会不同,A,光标移动到行尾开始输入)
- 按「i」切换进入插入模式,按“i”进入插入模式后是从光标当前位置开始输入文件
- 按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
- 按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。
- 插入模式到普通模式,使用ESC.不管在什么模式下,按ESC总能返回普通模式
- 普通模式到底行模式,使用:
- 如何保存退出—回到普通模式,按一个冒号:进入底行模式,然后按w,:w是保存数据,:q是退出,:wq,是保存并退出 :q! 不保存,强制退出
vim普通模式下的操作
光标的移动
- vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母h、j、k、l,分别控制光标左、下、上、右移一格
- ctrl+f,ctrl+b 向前,向后翻页,ctrl+f屏幕向前移动一页,ctrl+b屏幕向后移动一页
- G—直接跳转到文件末尾
- gg—跳转到首行,也就是进入文本开始
- gg=G,全文对齐
- 按$ :移动到光标所在行的行尾
- 按^ :移动到光标所在行的行首
- 按w :光标跳到下个字的开头
- 按e :光标跳到下个字的字尾
文本基本操作—复制/粘贴/剪切/删除
复制操作
- Linux下基本都是按行复制,如果需要进行复制的话,那么需要在普通模式种按下yy,就已经复制了,然后按p是粘贴到光标所在的下一行,P是向上粘贴,p是向下粘贴。如果想多行复制,就按下nyy,意思是复制n行的内容
- p :将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完成复制与粘贴功能。
删除操作
- dd—删除光标所在行,在vim中,其实没有真正的删除,其实是剪切操作
- ndd—从光标所在行就开始删除,一共删除n行的内容
- x—删除光标所在处的字符
- dw—删除单词
- nx—例如 6x 表示删除光标所在位置的后面(包含自己在内)6个字符
其他操作
撤销上一次操作
- u: 如果您误执行一个命令,可以马上按u,回到上一个操作。按多次“u”可以执行多次回
复。 - ctrl + r :撤销的恢复,也就是反向的撤销
Linux编译器—gcc/g++的使用
- 编译器—我们所写的C语言代码,是不能被机器直接识别的。因为C语言是一个高级语言,所写的代码不是一个机器能够识别的指令,因此这个时候就需要编译器来将这些高级语言所写的代码翻译为机器能够识别的指令集
- gcc是C语言的编译器,g++是C++语言的编译器
背景知识
编译器将高级语言代码解释成为机器指令集所经过的过程:
- 预处理(进行宏替换)
- 编译(生成汇编)
- 汇编(生成机器可识别代码)
- 连接(生成可执行文件或库文件)
预处理
预处理(宏替换,头文件引入,去掉注释)
- 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
- 预处理指令是以#号开头的代码行。
- 实例: gcc –E hello.c –o hello.i
- 选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
- 选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
- 代码有没有错误,在于处理就阶段是不关注的,就算有错误也不会报错,只是展开所有代码
- 实例子—gcc -E test.c -o test.i,
- 生成的test.i文件中就是展开的东西,包括头文件的展开
编译(生成汇编)—进行代码语法语义纠错,没错则将C语言程序解释成为汇编指令
*在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。
- 用户可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
- 实例: gcc –S hello.i –o hello.s,生成的.s文件里面全死汇编指令
汇编(生成机器可识别代码)—将汇编指令解释成为机器可以识别的指令,但是这时候生成的也不能直接运行,因为是不完整的。
- 汇编阶段是把编译阶段生成的“.s”文件转成目标文件
- 读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了
*实例: gcc –c hello.s –o hello.o -c是只进行汇编
链接(生成可执行文件或库文件)—将所有代码都打包到一起,最终生成可执行程序
- 在成功编译之后,就进入了链接阶段。
- 实例: gcc hello.o –o hello
函数库
- 我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而没有定义函数的实现,那么,是在哪里实“printf”函数的呢?
- 最后的答案是:系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用
函数库一般分为静态库和动态库两种
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6就是动态库。gcc在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。gcchello.o –o hello
- gcc默认生成的二进制程序,是动态链接的,这点可以通过file 命令验证。
链接方式—链接实际上就是把其他的代码都拿过来生成可执行程序
- 动态链接—在生成可执行程序文件中并不写入具体库种函数的实现代码,而是在可执行程序文件中记录了函数符号信息表,好处就是生成的可执行程序文件比较小,但是因为可执行程序中没有这些代码,因此运行程序饿时候不但要加载可执行程序,而且还要去加这个库到内存中,但是这种方式也有一个好处:多个程序在内存中可以使用同一个库(两个程序都用了C库,只需要加载一份到内存中就可以了),内存中代码冗比较少。
- 静态链接—在生成可执行程序的时候,直接将库种的代码写入到了可执行程序文件中,因此运行程序的时候就不需要加载文件库了,但是如果多个程序都使用了同一个库,则会在内存中造成代码冗余
- gcc默认使用动态链接