vim 和 gcc 的使用

Linux-编辑器 vim的使用
vim 的三种模式:
 1.普通模式(命令/正常模式)(用vim 初次打开的默认模式)
   控制屏幕光标的移动,字符、字或行的删除,移动复制某区段及进入Insert mode下,或者到 last line mode
 2.插入模式
   只有在Insert mode下,才可以做文字输入,按「ESC」键可回到命令行模式。该模式是我们后面用的最频繁的编辑模式。
 3.底行模式
   文件保存或退出,也可以进行文件替换,找字符串,列出行号等操作。 在命令模式下,shift+: 即可进入该模式。要查看你的所有模式:打开vim

模式转换
插入模式

按「i」切换进入插入模式「insert mode」,
       按“i”进入插入模式后是从光标当前位置开始输入文件;
按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;
按「o」进入插入模式后,是插入新的一行,从行首开 (光标换行)

命令模式

按[EXC] 键

普通模式切换至底行模式

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

插入模式下的操作
移删复替撤改跳

移动光标

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母
「h」、控制光标左移一格
「j」、控制光标下移一格
「k」、控制光标上移一格
「l」、控制光标右移一格
「w」、光标跳到下一个字的字首
「b」、光标跳到上一个字的字首,包含当前字
「e」、光标跳到下一个字的字首,包含当前字
按「G」:移动到当前文本的尾部
按「 $ 」:移动到光标所在行的“行尾”
按「^」:移动到光标所在行的“行首”
按「w」:光标跳到下个字的开头
按「e」:光标跳到下个字的字尾
按「b」:光标回到上个字的开头
按「#l」:光标移到该行的第#个位置,如:5l,56l
按[gg]:回到当前文本的头部
按[shift+g]:进入文本末端
按「ctrl」+「b」:屏幕往“后”移动一页
按「ctrl」+「f」:屏幕往“前”移动一页
按「ctrl」+「u」:屏幕往“后”移动半页
按「ctrl」+「d」:屏幕往“前”移动半页

删除文字

「x」:每按一次,删除光标所在位置的一个字符
「num x」:例如,「6x」表示删除光标所在位置的“后面(包含自己在内)”6个字符
「X」:大写的X,每按一次,删除光标所在位置的“前面”一个字符
「num X」:例如,「20X」表示删除光标所在位置的“前面”20个字符
「dd」:删除光标所在行
「num dd」:从光标所在行开始删除num行

复制

「yw」:将光标所在之处到字尾的字符复制到缓冲区中。
「#yw」:复制#个字到缓冲区
「yy」:复制光标所在行到缓冲区。
「#yy」:例如,「6yy」表示拷贝从光标所在的该行“往下数”6行文字。
「p」:将缓冲区内的字符贴到光标所在位置。
       注意:所有与“y”有关的复制命令
       都必须与“p”配合才能完成复制与粘贴功能。

替换

「r」:替换光标所在处的字符。
「R」:替换光标所到之处的字符,直到按下「ESC」键为止。

撤销上一次操作

「u」:如果您误执行一个命令,可以马上按下「u」,回到上一个操作。
        按多次“u”可以执行多次恢复。
「ctrl + r」: 撤销的恢复

更改

「cw」:更改光标所在处的字到字尾处
「c#w」:例如,「c3w」表示更改3个字

跳至指定行

「ctrl」+「g」列出光标所在行的行号。
「#G」:例如,「15G」,表示移动光标至文章的第15行行首。

linux-编辑器 gcc/g++的使用

gcc使用格式(编译C语言)

gcc [选项] 要编译的文件 [选项] [目标文件]

  通常我们所写的.c/.cpp文件,在VS,dev这些编辑器中,都是只需要我们按一个运行的按钮,就可以看到程序的执行结果,但是实际上代码的运行并不是这样一步到位的,编辑器会自动帮我们所编辑的.c/.cpp文件,在程序执行的过程中进行预处理,编译,汇编和连接,最后生成可运行的.exe文件。
直接产生可执行文件

gcc [.c文件] -o 要生成的文件名 -g

1.预处理(进行宏替换)阶段
  预处理功能主要包括宏定义,文件包含,条件编译,去注释等。就是将以#开始的头文件展开,define和typedef 宏定义的名称进行替换,去掉注释,生成一个.i文件

gcc –E hello.c –o hello.i

选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。

2.编译(生成汇编)
  在这个阶段中,gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,gcc 把代码翻译成汇编语言。可以使用“-S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。

gcc –S hello.i –o hello.s

3.汇编(生成机器可识别代码)
  汇编阶段是把编译阶段生成的“.s”文件转成目标文件。此时可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了,生成.obj文件

gcc –c hello.s –o hello.o

4.链接(生成可执行文件或库文件)
  在成功编译之后,就进入了链接阶段,生成可以执行的.exe文件

gcc hello.o –o hello

所涉及到的函数库,一般有两种,一种是静态库,另一种是动态库。
 静态库:在链接的时候进行静态链接,把可能使用的函数全部展开到可执行文件中,导致运行时文件所占内存会比较大,这样做会使得代码在不同的环境中也可以运行,不需要依赖其他的库。
 动态库:在链接的时候进行动态链接,在执行的时候,只是把需要的库进行展开到可执行文件中,这样产生的文件大小会比较小,可以节省系统的开销,但是在不同的环境中不一定可以运行,转换后的环境必须要有该程序所使用的库。 一般使用动态链接

Linux-调试器 gdb的使用
1.事前

r或run:运行程序。
list或l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list或l 函数名:列出某个函数的源代码。
info(或i) breakpoints:参看当前设置了哪些断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
s或step:进入函数调用(逐语句调试  F11)
n 或 next:单条执行(逐过程调试 F10)
print(p):打印变量的值,通过表达式可以修改变量的值或者调用函数

2.事中

将gdb附加到进程上面
dgb -p [pid]
gdb attch [pid]
pid  ==  ps aux | grep [可执行程序]
|  管道符

3.事后(程序崩溃的情况)
产生coredump文件

ulimit -a  -->core file size  -->unlimited

  如果core file size 的空间足够大,但是磁盘的空间不足,也有可能不会产生coredump文件
  如果core file size 的值为0,则需要把产生文件的大小调整一下。
ulimit -c unlimited

eg:解引用空指针产生程序崩溃,产生coredump文件

#include<stdio.h>
int main()
{
     int* p=NULL;
     *p=10;
     printf("haha\n");                                                       
     
     return 0;
}

排查错误的步骤:
 1.知道当前代码崩溃时调用堆栈的信息,根据调用堆栈信息,确定代码崩溃在哪一行
 2.配合源代码查看对应行代码是否有崩溃的风险,分析当前崩溃是不是由该风险导致的,eg:访问野指针,解引用空指针,内存越界(难排查)等。

gdb o core.16653
bt 调用堆栈

make/makefile
 1.make解释器解释编译规则的文件是 makefile/Makefile
 2.makefile的编译规则
目标对象:依赖对象
(一个tab键)编译命令

 3.解释规则
  1.对比目标对象和依赖对象的最后一次修改时间,如果目标对象最后一次修改的时间距离现在比较近,则认为目标对象比较新,则不会重新生成目标对象。反之,则认为依赖对象比较新,则重新执行编译命令,生成目标对象。
  2.永远只为了生成第一个目标对象而服务,如果有多个目标对象,则从上向下,执行找到的第一个依赖对象。
  3.如果依赖对象不存在,则会在当前makefile的编写规则下去查找生成依赖对象的方法(递归执行)。(-c 指到汇编就停止,不再继续链接)

  4.如果没有依赖对象的生成方法,则make会补全依赖对象的生成方法,但是依赖对象的名称和源码文件名称是强相关的,也就是说如果依赖对象名称和源码文件不相同则不会补全命令
预定义变量:
 $^ :所有依赖对象
  $@ :目标对象
 #< :第一个依赖对象

清理:

clean -->清理命令

伪目标:使当前定义为伪目标的对象,一直生成,也就是说,不会参考最后一次修改时间

.PHONY:[后面加定义伪目标的名称]

自定义变量:

BIN/SRC/OBJ
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章