Linux开发工具——VIM,GCC/G++,GBD与Makefile

一、VIM

       1.VIM的模式

         VIM是一种具有多种模式的编辑器,常用模式有命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode):

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

 

2. vim的基本操作

进入vim,在系统提示符号输入vim及文件名称后,就进入vim全屏幕编辑画面:

$ vim test.c

不过有一点要特别注意,就是你进入vim之后,是处于[正常模式],你要切换到[插入模式]才能够输入文字。

[正常模式]切换至[插入模式]

输入a

输入i

输入o

[插入模式]切换至[正常模式]

目前处于[插入模式],就只能一直输入文字,如果发现输错了字,想用光标键往回移动,将该字删除,可以先按一下「ESC」键转到[正常模式]再删除文字。当然,也可以直接删除。

[正常模式]切换至[末行模式]

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

退出vim及保存文件,[正常模式]下,按一下「:」冒号键进入「Last line mode,例如:

: w (保存当前文件)

: wq (输入「wq,存盘并退出vim)

: q! (输入q!,不存盘强制退出vim)

3. vim正常模式命令集

插入模式

按「i」切换进入插入模式「insert mode」,按“i”进入插入模式后是从光标当前位置开始输入文件;

按「a」进入插入模式后,是从目前光标所在位置的下一个位置开始输入文字;

按「o」进入插入模式后,是插入新的一行,从行首开始输入文字。

从插入模式切换为命令模式

按「ESC」键。

移动光标

vim可以直接用键盘上的光标来上下左右移动,但正规的vim是用小写英文字母「h」、「j」、「k」、 「l」,分别控制光标左、下、上、右移一格

按「G」:移动到文章的最后

按「 $ 」:移动到光标所在行的“行尾”

按「^」:移动到光标所在行的“行首”

按「w」:光标跳到下个字的开头

按「e」:光标跳到下个字的字尾

按「b」:光标回到上个字的开头

按「#l」:光标移到该行的第#个位置,如:5l,56l

按[gg]:进入到文本开始

按[shiftg]:进入文本末端

按「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行文字。

「p」:将缓冲区内的字符贴到光标所在位置。注意:所有与“y”有关的复制命令都必须与“p”配合才能完 成复制与粘贴功能。

替换

r」:替换光标所在处的字符。

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

撤销上一次操作

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

「ctrl + r」: 撤销的恢复

更改

cw」:更改光标所在处的字到字尾处

c#w」:例如,「c3w」表示更改3个字

跳至指定的行

「ctrl」+「g」列出光标所在行的行号。

#G」:例如,「15G」,表示移动光标至文章的第15行行首。

4. vim末行模式命令集

在使用末行模式之前,请记住先按「ESC」键确定您已经处于正常模式,再按「:」冒号即可进入末行模式。

列出行号

「set nu」: 输入「set nu」后,会在文件中的每一行前面列出行号。

跳到文件中的某一行

#:#」号表示一个数字,在冒号后输入一个数字,再按回车键就会跳到该行了,如输入数字15

再回车,就会跳到文章的第15行。

查找字符

「/关键字」: 先按「/」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以一直按 「n」会往后寻找到您要的关键字为止。

「?关键字」:先按「?」键,再输入您想寻找的字符,如果第一次找的关键字不是您想要的,可以直 按「n」会往前寻找到您要的关键字为止。

注意:/是向下查找,而?是向上查找!

保存文件

w: 在冒号输入字母「w」就可以将文件保存起来

离开vim

q」:按「q」就是退出,如果无法离开vim,可以在「q」后跟一个「!」强制离开vim

wq」:一般建议离开时,搭配「w」一起使用,这样在退出的时候还可以保存文件。

二、GCC/G++

1.编译过程:

预处理 ( 进行宏替换 ):
预处理功能主要包括宏定义 , 文件包含 , 条件编译 , 去注释等。
预处理指令是以 # 号开头的代码行。
实例 : gcc –E hello.c –o hello.i
选项 “-E”, 该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项 “-o” 是指目标文件 ,“.i” 文件为已经过预处理的 C 原始程序。
编译(生成汇编):
在这个阶段中 ,gcc 首先要检查代码的规范性、是否有语法错误等 , 以确定代码的实际要做的工作 , 在检查
无误后 ,gcc 把代码翻译成汇编语言。
用户可以使用 “-S” 选项来进行查看 , 该选项只进行编译而不进行汇编 , 生成汇编代码。
实例 : gcc –S hello.i –o hello.s
汇编(生成机器可识别代码):
汇编阶段是把编译阶段生成的 “.s” 文件转成目标文件
读者在此可使用选项 “-c” 就可看到汇编代码已转化为 “.o” 的二进制目标代码了
实例 : gcc –c hello.s –o hello.o
连接(生成可执行文件或库文件):
在成功编译之后 , 就进入了链接阶段。
实例 : 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 就可以生成可执行文件 , 如下所示。 gcc
hello.o –o hello
gcc 默认生成的二进制程序,是动态链接的。

2.使用方法:

格式: gcc [ 选项 ] 要编译的文件 [ 选项 ] [ 目标文件 ]
可选参数:
-E 只激活预处理 , 这个不生成文件 , 你需要把它重定向到一个输出文件里面
-S  编译到汇编语言不进行汇编和链接
-c  编译到目标代码
-o+文件名 对生成的目标文件命名,否则默认为a.xxx
-static 此选项对生成的文件采用静态链接
-g 生成调试信息。GNU 调试器可利用该信息。
-shared  此选项将尽量使用动态库,所以生成文件比较小,但是需要系统由动态库 .
-O0
-O1
-O2
-O3 编译器的优化选项的 4 个级别, -O0 表示没有优化 ,-O1 为缺省值, -O3 优化级别最高
-w  不生成任何警告信息。
-Wall 生成所有警告信息。
三、Linux调试器GBD

1. 使用准备

程序的发布方式有两种,debug模式和release模式

Linux gcc/g++出来的二进制程序,默认是release模式

要使用gdb调试,必须在源代码生成二进制程序的时候, 加上 -g 选项

例如:

gcc test.c -o test -g

2. 开始使用

gdb binFile 退出: ctrl + d quit 调试命令:

list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。

listl 函数名:列出某个函数的源代码。

r或run:运行程序。

n 或 next:单条执行。

s或step:进入函数调用,注意该命令可以进入其他文件中的被调用函数

break(b) 行号:在某一行设置断点

break 函数名:在某个函数开头设置断点

info break :查看断点信息。

fifinish:执行到当前函数返回,然后挺下来等待命令

print(p):打印表达式的值,通过表达式可以修改变量的值或者调用函数

p 变量:打印变量值。

set var:修改变量的值

continue(c):从当前位置开始连续而非单步执行程序

run(r):从开始连续而非单步执行程序

delete breakpoints:删除所有断点

delete breakpoints n:删除序号为n的断点

disable breakpoints:禁用断点

enable breakpoints:启用断点

info(i) breakpoints:参看当前设置了哪些断点

display 变量名:跟踪查看一个变量,每次停下来都显示它的值

undisplay:取消对先前设置的那些变量的跟踪

until X行号:跳至X

breaktrace(bt):查看各级函数调用及参数

infoi) locals:查看当前栈帧局部变量的值

quit:退出gdb

四、Makefile

1.介绍        

        Makefile是一个用来描述Linux系统下C/C++工程的编译规则的文件,它可以让你用一个make命令来自动化编译整个项目,而不需要手动执行一个个gcc命令。Makefile可以帮助你管理代码的编译,决定哪些文件需要先编译,哪些文件需要重新编译,以及如何链接生成可执行文件或者库文件。Makefile还可以让你定义一些变量、函数、条件和循环等,来简化和优化编译过程。

2.使用方法

        要使用Makefile首先需要创建Makefile或makefile文件(一般与程序源文件在一个目录),然后用vim或其他文本编辑软件打开Makefile进行编译。

      例如:

.PHONY:Reactor
Reactor :Reactor.cpp
	g++ $^ -o $@ -std=c++11 
.PHONY:clean
clean:
	rm -f Reactor

保存好此makefile文件后,进入makefile文件所在目录,在命令行输make后,自动检索第一条指令

Reactor :Reactor.cpp,其中Reactor是要生成的文件,称为目标文件,Reactor.cpp是生成文件所需要的源文件,称为依赖文件,如果Reactor.cpp存在,则直接执行g++ $^ -o $@ -std=c++11($^代表依赖文件,$@代表目标文件) ,如果不存在则继续向下寻找目标文件为Reactor.cpp的指令,然后执行,再回过来执行g++ $^ -o $@ -std=c++11 ,如果最后都没有找到,则执行失败。

.PHONY:代表某条指令如果要执行,则强制执行,比如当命令的依赖文件Reactor.cpp与上次执行g++指令时没有变化时,一般gcc指令不会再执行,加上.PHONY则强制执行,一般将它用在clean指令前,以确保每次clean指令都会执行,防止如果我们的工程目录下恰好有一个叫clean的文件,那么Make就会认为这个目标已经存在,而不会执行它的命令。

有依赖情的况例如:

 也可以在makefile文件中以如下方式定义只定义目标文件和源文件依赖,而不定义需要执行的命令,来指定所需要的所有文件,当在命令行输入命令make all之后,将同时执行两个指令,而不用输入make tcpclient tcpsever这样的形式。

.PHONY:all
all:tcpclient tcpsever
tcpclient:tcpclient.cpp
	g++ $^ -o $@ -std=c++11
tcpsever:tcpsever.cpp
	g++ $^ -o $@ -lpthread -std=c++11

.PHONY:clean
clean:
	rm -f tcpclient tcpsever

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值