Linux上的常用重要基础工具
常用基础工具
yum:Linux的软件包管理器
yum主要作用:软件包管理工具,完成第三方软件的安装与卸载功能。
1.什么是软件包:
- 一般情况下,我们在linux下安装软件,就会直接下载到程序的源代码,然后进行编译,就得到了可执行程序
- 但是这样确实太麻烦了,所以有些人会吧一些常用的软件提前编译好,做成软件包,放在一个服务器上,并且通过包管理会让我们很方便的就得到一个编译好的软件包,直接进行安装就好了。
- 而软件包和软件,就像手机上的软件商店和软件一样。
- 而yum是Linux非常常用的一种包管理器。
2.yum的使用方法:
①:如何查看软件包:
语法:yum list
功能:查看yum的所有软件包。
特别的:在list后面还可以加入一些寻找的指令,通过管道符相连,例如:
yum list | grep vim//寻找yum中含有vim字符名字的安装包
去其结果如下图(为其中的一个示例):
其各个名称的解释为:
- 软件包名称:主版本号.次版本号.源程序发型号-软件包发型号.主机平台.cpu架构
- “x86_64”后缀表示64位操作系统的安装包,还有一个是“i686”表示32位系统安装包
- “el7”表示操作系统的发行版本
- 最后一列表示的是“软件源”的名称。
②:安装软件:
语法:yum install 工具名称
例如:
yum install vim //下载与vim有关的相应工具
yum会自动找到都有哪些软件包需要下载,此时我们只需要等待即可。
注意:
安装软件的时候需要使用管理员系统进行操作。
yum进行安装的时候,一次只能安装一个,如果在安装的时候进行下一次安装那么就会报错。
③:卸载软件:
语法:yum remove 工具名称
例如:
yum remove vim//卸载vim
注意:用法和安装软件的时候相似,必须在管理员的情况下进行操作。
vim:Linux的编辑器
vim主要功能:编辑器,linux下写代码的工具。
首先,在vim的编辑下是不支持鼠标对光标的操作的,一般情况下都是使用命令去完成各个操作的,因为vim是编译器,所以还具备有插入数据的功能,因此vim为了实现命令操作与数据插入互不干扰,设计了多重操作模式。
1.vim的基本概念:
vim的操作模式一共有12种,但是我们常用的基本模式有三种,分别如下:
- 普通/正常/命令模式:执行文本内容进行操作的指令。(控制屏幕光标的移动,字符的删除等等操作)
- 插入模式:文本数据的插入。
- 底行模式:保存所写的内容,进行退出。
2.vim的基本操作:
- vim的使用方法:
①:语法:vim 文件名
注意:如果此时所写的文件名不存在,那么就直接创建一个新的文件,并进入编辑。并且打开时默认处于普通模式。 - vim的模式切换:
①:普通模式切换到插入模式:
输入i:从当前位置开始进行文本数据的插入。
输入a:从当前位置的下一个位置进行文本数据的插入。
输入o:从当前位置另起一行进行文本数据的插入。
②:插入模式到普通模式:
按一下Esc这个按键即可切换(切换后就可以进行普通模式的相应操作)。
③:普通模式到底行模式:
使用Shift+;或者直接使用:即可。(只能由普通模式切换到底行模式,插入模式不能切换到底行模式)
④:退出vim的文件保存。
在进入底行模式的时候有以下三个操作:
:w(保存当前文件)
:wq(保存文件并退出vim)
:q!(不保存文件,强制退出vim)
3.vim普通模式下的常用重要命令:
①:剪切(删除)指令:dd(删除或者剪切光标所在的行),ndd(删除或剪切从光标开始往下数n行的内容)
②:p(粘贴):将剪切版的内容粘贴到光标所处行的下一行上。
③:x:删除光标所在的字符。
④:dw:删除光标所在的单词。
⑤:复制指令:yy(复制光标所在的行),nyy(复制从光标开始往下数n行的内容)
⑥:u:撤销上一次操作。
⑦:Ctrl+r:还原上一次撤销的内容。
⑧:光标移动:
上下左右:可以在插入模式下使用键盘上下左右的按键,也可也在普通模式下使用hjkl的按键。
Ctrl+f/b:上下翻页。
G:直接让光标移动到文件的末尾。
gg:直接让光标移动到文件的开端。
⑨:全文对齐操作:gg=G。
特别的:当我们需要在全文进行修改一个字符的名字的时候可以使用下面例子的方法:
当我们需要将1到12行的printf换成sancf时可以使用如下操作(该操作是在底行模式下实现的):
1,12s/printf/scanf/g //即可将1到12行的printf变成scanf
g++/gcc:Linux的编译器
主要功能:对vim编辑的文本进行编译,将高级语言进行编译成为机器指令。
1.编译过程经过如下四部:
①:预处理阶段:
主要作用:展开所有代码(如引入头文件,进行宏替换,删除注释等等)。预处理的指令是以#开头的代码行。
使用例子如下:
gcc-E main.c-o main.i //将main.c文件进行预处理成为main.i文件
其中:-E的作用是让gcc在预处理之后就停止,不进行下一步。
-o是指定目标文件“.i”为已经被预处理过了。
②:编译阶段:
主要作用:首先gcc要进行语法检查,如果没有语法错误,确定好代码实际要做的工作后,则将代码解释成为汇编指令。
使用例子如下:
gcc-S main.i -o main.s //将main.i文件进行编译成为main.s文件
其中:-S的作用是让gcc在编译之后后进行停止
③:汇编阶段:
主要作用:将汇编指令解释成为二进制机器指令。
使用例子如下:
gcc -c main.s -o main.o //将main.s文件进行汇编成为main.o文件
其中:-c的作用是让gcc在汇编之后停止。
④:链接阶段:
主要作用:将所有需要的二进制机器指令打包并生成一个可执行程序。
使用例子:
gcc main.o -o main //将main.o文件链接成为可执行文件main
2.函数库:
函数库一般分为两个,为静态库和动态库:
①:静态库:指在编译期间,将库中所有代码全部加入到可执行文件中,因此生成的文件比较大,但是在运行的时候也就不依赖库。
②:动态库:与静态库刚好相反,并没有将所有代码全部加入到可执行文件中,而是在程序执行的期间,通过链接文件加载这个库,所以大大减少了系统的开销,但是运行的时候依赖库的存在。
③:而gcc默认链接方式为动态库。
gdb:Linux的调试器
1.首先:
①:程序的发布方式为两种,一种是release模式,一种是debug模式。
debug模式:不进行代码优化,加入调试信息。
release模式:进行代码优化,提高程序的运行效率。
②:gcc/g++出来的二进制程序,默认情况下是release模式。
③:使用gdb去调试程序的话,就必须在源代码生成二进制的过程中的时候,加上-g选项(必须在汇编前完成)。
例如:
gcc -g main.c -o main //将main生成出来的二进制程序为debug模式,可以进行调试
2.常见的调试指令:
①:开始调试:
run:直接运行结束。
start:开始逐步调试。
②:list指令
语法(以child.c文件为例):
list child.c: n //意思为查看child.c文件第n行附件的代码。
②:n/next:进行下一行操作,是逐过程的。
③:s/step:进行下一行操作,是逐语句的。
④:until指令
语法(以child.c文件为例):
until child.c:n //意思为直接运行到指定文件的指定行(该指定文件为主文件)
⑤:b/break:打断点
使用方法:
b/break main.c:n //(在main.c文件的第n行打一个断点)
还可以给函数打断点,将文件名的位置换成函数名即可。
⑥:d/delete:删除断点
使用方法:
d/delete 断电名 //就可以删除该断点
⑦:info break(或者 i b)查看断点信息
使用的时候直接打上去即可,删除断点的时候需要查看断点信息然后进行准确删除,但是如果删除断点之后不加断点
⑧:printf:查看变量数据
⑨:watch:
使用方法:watch 变量
功能:给变量打一个监控断点,变量变化的时候触发。
⑩:continue:从调试位置开始不再逐步调试而是继续向下运行。
最后还有一个比较特殊的:
backtrace:查看函数调用栈,快速找到程序崩溃的位置。
如果程序完成正常运行,那么函数调用栈中没有数据,如果发生错误,那么调用栈的栈顶元素就是发生错误的函数。
makefile:Linux的项目自动化构建工具
1.makefile的背景:
- 一个工程中的源文件不计其数,按照其类型,功能,模块分别放在若干个目录中,makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件需要后编译, 那些文件需要重新编译,甚至进行更复杂的工作。
- makefile带来的好处就是“自动化编译”,一旦写好,只需要一个make指令,整个工程便可以完全自动编译,极大地提高了软件的开发效率。
- make是一个命令工具,是一个解释makefile中指令的工具,会在当前目录下找到名为makefile的文件进行逐行解释执行。
- make是一条命令,makefile是一个文件,两个搭配使用,完成项目的自动化构建。
2.makefile的编写规则:
①:语法如下:
目标文件:依赖对象
为了生成目标需要的指令
例子如下:
(以main.c和test.c为例子,生成main为例子)
main:main.c test.c
gcc main.c test.c -o main
上述例子中,gcc前面为一个[Tab]按键。
②:由于在工程中,源文件数量巨大,所以我们设置了一些预定义变量,如下:
- $@:目标对象
- $^:所有依赖对象
- $<:所有依赖对象的第一个
所以上述例子就变成如下:
main:main.c test.c
gcc $^ -o $@
③:由于还要将main.c和test.c还要再写一遍,所以我们又推出了新的符号
在文件最上端我们可以写一串这样的代码:
SRC = $(wildcard ./* .c) //意思为,让该目录下的所有.c文件的名称被SRC所赋值
那么上述例子就变成如下:
main:$(SRC)
gcc $^ -o $@
特例:如果我们在上述的操作下需要所有的.o文件,我们可以使用下面这串代码:
OBJ = $(patsubst %.c,%.o,$(SRC))
然后需要一个make,便可以运行成功。
④:make解释的执行规则:会在生长第一个目标对象后就会退出
所以我们在使用的时候,需要将最终生成的目标对象放在首位置,其他的make在生成的时候,会向下找。
⑤:.PHONY:声明一个伪对象(与外部文件不同),但是每次使用总是会重新生成对象。例如我们生成clean,由于工程是需要被清理的,所以我们需要设置clean,但是clean不会被执行,所以我们必须手动敲击 make clean进行项目清理,此时clean就需要被声明为伪对象。