目录
一.yum——安装软件
二.Vim——文本编辑器
(1).命令模式
(2).底行模式
(3).插入模式
tips:给对应用户配置sudo命令
一些注意事项
三.gcc/g++——编译器
(1).gcc如何完成翻译的四个过程
记忆方法/-o选项的使用
四.gdb——调试器
Q:为什么要加-g才能调试
常用选项
五.make/Makefile——自动化构建工具
(1).概念
(2).使用
添加依赖关系/依赖方法
添加清理功能
Q:.PHONY有什么用
(3).原理
一.yum——安装软件
yum就类似手机上的应用市场,一些特定的组织或者个人把Linux下相关的软件都放在了一个特定的服务器上,yum会自动在特定的服务器上找到对应的服务,并下载下来,同时yum还会把当前服务所需要的其他服务(软件/依赖关系)都下载到你的主机上。
yum list:查看可以安装的软件
yum install:安装软件
yum remove:删除软件
二.Vim——文本编辑器
(1).命令模式
光标相关:
- h(左)j(下)k(上)l(右)
- shitf+^(行首)
- shift+$(行尾)
- gg(起始行,第一行)
- shift+g(结束行,最后一行)
- n+shift+g(指定行)
- b/w:按照单词为单位进行前后光标移动
补充:
- 批量注释方法:crtl v 用jk选中区域,再按大写I,然后//,再按esc
- crtl v jk 选中区域,d,就删除了注释
- ! man fork:在不退出Vim的情况下查看man手册
- ! make:不退出Vim的情况下编译程序
- !./生成的程序名:在不退出Vim的情况下运行程序
文本操作:
- yy:复制当前行
- nyy:复制当前行及其之后的n行,包含当前行
- p:粘贴复制的内容(可以复制多行)(复制一行以后可以粘贴10000行,vs下让你复制10000行????)
- np:一次重复粘贴n倍复制的行(如果复制了5行,3p就是粘贴3倍复制的内容,一共15行)
- dd:删除当前光标所在行,支持ndd
- dd之后再p:剪切功能(dd实际上就是删除并复制,dd后再p就像是剪切)
- x:左向右删除光标所在的字符,支持nx
- X:右向左删除,删除光标所在位置之前的字符(就和backspace一样),也是支持nX
- r:替换一个字符,光标所在的字符,支持nr
- shift+r:替换模式,直接进行多个内容的替换
- u:撤销误操作
- ctrl+r:撤销最近的撤销
- shift+~:快速大小写切换
(2).底行模式
- set nu:调出行号
- set nonu:取消行号
- vs 文件:打开另一个文件,分屏进行多文件操作 [ctrl+w+w可以让光标在屏幕之间跳转]
- 可以在一个文件中复制,然后光标切换到另一个文件粘贴
- 光标在哪里,按:就会进入哪个文件的底行模式,可以退出那个文件
- w:保存
- q:退出
- ! :强制 [w ! , q!, wq! ]注意顺序
(3).插入模式
i,a,o都可以进入插入模式
- i光标位置不变
- a光标位置向后移动一个
- o光标位置新加一个空行,然后光标到这个空行
tips:给对应用户配置sudo命令
[root@VM-8-12-centos ~]# vim /etc/sudoers
在root用户下输入指令 vim /etc/sudoers,修改sudoers文件中
## Allow root to run any commands anywhere
这一行下面的内容,将需要加入sudo命令的用户加入这里即可。
一些注意事项
1.在插入模式下,Linux中的光标是覆盖在字符上面的,此时backspace删除和插入字符是作用在当前光标之前的。
2.Vim卡死,这并不是Linux死机,或者vim卡住,而只是按了Ctrl + s后,vim停止向终端输出。解决方法:退出这种状态,按下Ctrl + q
3.一般情况下,底行模式和插入模式之前必须经过命令模式,不能直接切换
- 底行模式->插入模式, 按esc到命令模式,按i/a/o到插入模式
- 插入模式->底行模式, 按esc到命令模式,按:到底行模式
无论当前处于什么模式,esc一定可以回到命令模式
三.gcc/g++——编译器
(1).gcc如何完成翻译的四个过程
1.gcc不带选项编译文件,默认生成的文件名是a.out,再编译,还是a.out
1. 预处理(进行宏替换)
2. 编译(生成汇编)
3. 汇编(生成机器可识别代码)
4. 链接(生成可执行文件或库文件)
这四个步骤可以叫做是翻译
1.gcc -E mytest.c -o mytest.i,将源文件进行预处理,完成以后生成mytest.i文件(预编译文件)(预处理后的文件我们一般命名为.i,注意这里需要指明文件名)
- 预处理的作用---头文件展开,去掉注释,条件编译,宏替换
2.gcc -S mytest.i -o mytest.s,将预处理后的.i文件进行编译,完成以后生成mytest.s文件(汇编文件)(这里不-o指定文件名也可以,但是为了和前面的-E统一,还是指定一下)
- 编译的作用---将预处理后的文件(C语言)变成汇编文件(汇编语言)
3.gcc -c mytest.s -o mytest.o ,将编译以后的汇编文件,也就是.s文件,进行汇编操作,完成以后生成mytest.o文件(可重定向的目标文件,一个二进制文件,在windows下就是mytest.obj)
- 汇编的作用---将汇编文件转化成可重定向的目标文件,变成一个二进制文件(计算机不能直接执行汇编文件,汇编语言也有编译器)
注:生成的这个二进制文件我们还是无法执行
我们可以使用od命令查看二进制文件,让它以八进制或者十六进制的形式显示
od hello.o
4.gcc mytest.o -o mytest ,将汇编以后的目标文件生成可执行文件mytest(这里不加后缀名也可以)
- 链接的作用---将代码中的函数调用,外部数据(比如一定义在库里面的变量)与各种库关联起来(你调用函数,但是函数定义在库里面,需要链接将其关联起来,这样函数调用的时候就可以找到函数的定义了)
ps:语言给我们提供的一般是一套头文件+一套库文件,我们使用printf的函数,实际上就是在库里面实现的。
记忆方法/-o选项的使用
1.我们在指定输出文件的名称时,这两种写法都行,-o表示输出到目标文件
gcc mytest.c -o mytest
gcc -o mytest mytest.c
2.前三个过程使用选项和生成文件的记忆方法:
- gcc-E,-S,-c,记忆方法,对应的就是键盘左上角的esc键
- 生成的文件分别是.i .s .o,刚好是对应的iso,一个镜像文件的后缀
四.gdb——调试器
Q:为什么要加-g才能调试
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项,使其变成debug模式
如果一个程序是可以被调试的,该程序的二进制文件一定如入了一些debug信息!
我们看到release模式下,生成的可执行文件的大小比debug模式下要小,因为加上-g,变成debug模式后,加入了一些debug信息,所以才能对其进行调试。
常用选项
- list/l 行号:显示当前行号开始的10行代码,再输入l接着上次的位置往下
- list/l 函数名:列出某个函数的源代码。
- r或run:运行程序。
- n 或 next:单条执行。(逐语句,不会进入函数)
- s或step:进入函数调用(逐过程,会进入函数)
- break(b) 行号:在某一行设置断点
- b 函数名:在某个函数开头设置断点
- info b :查看断点信息。
- finish:执行到当前函数返回,然后挺下来等待命令
- print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数
- p 变量:打印变量值。(display是每次n或者s都显示,p是只打印一次)
- set var:修改变量的值
- continue(或c):从当前位置开始连续而非单步执行程序(直到下一个断点)
- run(或r):从开始连续而非单步执行程序
- delete breakpoints:删除所有断点
- delete breakpoint(b) n:删除序号为n的断点
- disable breakpoints:禁用断点
- enable breakpoints:启用断点
- info(或i) breakpoints:参看当前设置了哪些断点
- display 变量名:跟踪查看一个变量,每次停下来都显示它的值(可以display &变量名看地址)
- undisplay:取消对先前设置的那些变量的跟踪(后面跟的是变量对应的编号,而不是变量名)
- until X行号:跳至X行(注意对比finish,continue,until的区别和用法,可以快速定位问题大概的位置)
- breaktrace(或bt):查看各级函数调用及参数
- info(i) locals:查看当前栈帧局部变量的值
- quit:退出gdb
五.make/Makefile——自动化构建工具
(1).概念
1.make是一个命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建(形成可执行程序,不需要我们自己gcc项目中的所有文件)
2.依赖关系
Makefile内部可以让我们写上依赖关系和依赖方法
只有依赖关系和依赖方法共同作用才可以达到目的
(2).使用
1.touch 一个名为Makefile文件(也可以是makefile)
添加依赖关系/依赖方法
2.比如我们现在有mytest.c文件,要生成mytest的可执行文件。
此时mytest的生成依赖于mytest.c,依赖方法是通过gcc
第一行是依赖关系前者:(:表示依赖,这里表示前者依赖后者)后者,第二行是依赖方法(注意第二行必须是Tab键开头)
1 test:test.cpp
2 gcc -o test test.cpp
3.此时我们直接使用make指令单走就可以自动根据mytest.c生成mytest可执行文件。此时不做任何修改再make,会提示已经是最新的了,无法再make了。
添加清理功能
1.在Makefile文件中添加:
1 test:test.cpp
2 gcc -o test test.cpp
3 .PHONY:clean
4 clean:
5 rm -f test
注意这里的.PHONY:clean就是一个修饰,表示指定伪目标,对当前文件可以一直执行make clean。后面的clean :后面是空,实际上就是表示没有依赖关系。第二行的就是依赖方法,意思就是可以直接执行依赖方法,不需要依赖关系。而上面的test:后面就有依赖关系,就是要依赖test.cpp
2.直接make clean,会发现刚刚make生成的可执行文件没了。
3.Linux下的make和make clean就类比于vs中的生成解决方案和清理解决方案
Q:.PHONY有什么用
- .PHONY:clean就是一个修饰,表示指定伪目标,对当前文件可以一直执行make clean
- 像make,我们如果不对齐进行修改,第二次就无法执行make,这就不具备总是可执行这一性质,但是clean就可以一直被执行,因为经过.PHONY修饰是一个伪目标
- 如果我们给mytest也加上.PHONY,则我们也可以一直make,但是没必要,你没有修改源文件,按理说就不需要make
- clean :后面是空,实际上就是表示没有依赖关系。第二行的就是依赖方法,意思就是可以直接执行依赖方法,不需要依赖关系。而上面的test:后面就有依赖关系,就是test.cpp
(3).原理
1. make会在当前目录下找名字叫“Makefile”或“makefile”的文件。
2.如果找到,它会找文件中的第一个目标文件,比如这里我们make的时候会找第一个目标文件,也就是这里的mycode,并把其当做最终的目标文件。
3.如果目标文件不存在,根据依赖关系找mycode所依赖的文件mycode.o,找到后执行依赖方法生成文件。
4.如果不存在,就继续往后找,找当前mycode.o依赖的文件,找到以后执行依赖方法生成,然后在返回去生成原来的目标文件。执行流程像一个栈