Linux下使用vim编辑C程序
1 vi/vim使用
1.1 vi/vim简介
vi/vim是Linux、Unix字符界面下常用的编辑工具,也是系统管理员常用的一种编辑工具。很多Linux发行版都默认安装了vi/vim。vim是vi的升级版,和vi的基本操作相同,其相对于vi的优点主要在于可以根据文件类型高亮显示某些关键字,如C语言关键字,便于编程。
vi/vim有两种状态:命令状态和编辑状态。
1)命令状态:可以输入相关命令,如文件保存、退出、字符搜索、剪切等操作;vi/vim启动时,默认进入命令状态。在编辑状态下,按ESC键,即可进入命令状态;
2)编辑状态:在该状态下进行字符编辑。在命令状态下,按i/a/I/A/O/o等键即可进入编辑状态。
1.2 vim安装
如果Linux主机中没有安装vim,请执行以下命令(在Linux主机能访问互联网的情况下):
sudo apt-get install vim
按照提示安装即可。(按Y)
稍等一会直到提示安装完成。
1.3 vi/vim常用命令
表1 vi/vim常用命令(命令状态下使用)
命令 |
功能说明 |
插入字符、行,执行下面操作后,进入编辑状态 |
|
a |
进入插入模式,在光标所在处后面添加文本 |
i |
进入插入模式,在光标所在处前面添加文本 |
A |
进入插入模式,在光标所在行末尾添加文本 |
I |
进入插入模式,在光标所在行行首添加文本(非空字符前) |
o |
进入插入模式,在光标所在行下新建一行 |
O |
进入插入模式,在光标所在行上新建一行 |
R |
进入替换模式,覆盖光标所在处文本 |
剪切、粘贴、恢复操作 |
|
dd |
剪切光标所在行 |
Ndd |
N代表一个数字,剪切从光标所在行开始的连续N行 |
yy |
拷贝光标所在行 |
Nyy |
N代表一个数字,复制从光标所在行开始的连续N行 |
yw |
复制从光标开始到行末的字符 |
Nyw |
N代表一个数字,复制从光标开始到行末的N个单词 |
y^ |
复制从光标开始到行首的字符 |
y$ |
复制从光标开始到行末的字符 |
p |
粘贴剪切板的内容在光标后(或所在行的下一行,针对整行复制) |
P |
粘贴剪切板的内容在光标前(或所在行的上一行,针对整行复制) |
u |
撤销上一步所做的操作 |
保存、退出、打开多个文件 |
|
:q! |
强制退出,不保存 |
:w |
保存文件,使用:w file,将当前文件保存为file |
:wq |
保存退出 |
:new |
在当前窗口新建一个文本,使用:new file,打开file文件,使用Ctrl+ww在多个窗口间切换 |
设置行号,跳转 |
|
:set nu |
显示行号,使用:set nu!或:set nonu可以取消显示行号 |
n+ |
向下跳n行 |
n- |
向上跳n行 |
nG |
跳到行号为n的行 |
G |
跳到最后一行 |
H |
跳到第一行 |
查找、替换 |
|
/*** |
查找并高亮显示***的字符串,如/abc |
:s |
:s/old/new//,用new替换行中首次出现的old :s/old/new/g,用new替换行中所有的old :n,m s/old/new/g,用new替换从n到m行中所有new :%s/old/new/g,用new替换当前文件中所有old |
1.4 vi/vim使用示例
如要编辑当前目录下名为 helloworld.c 的文件:
step1:输入vim helloworld.c,即可进入vim窗口,如helloworld.c不存在,则新建该文件,否则是打开该文件。vim默认处于命令状态。
step2:按i,进入编辑状态。
step3:编辑代码。
step4:按Esc,回到命令状态。
step5:输入 :wq,保存并退出。
1.5 VIM配置
在我们的环境中,为了使VIM更好使用,建议更改vim配置文件:/etc/vim/vimrc文件。
修改时,请使用如下命令:
sudo vim /etc/vim/vimrc
注:请大家对应上面的修改,修改自身机器的配置。(上面红字是为了解释而增加的,大家不要把这些红色汉字也写入)
1.6 vi/vim常见问题及解决方法
问题1:按Ctrl+s键(Windows下的保存快捷键)后,发现vim对后续按键不再反应。原因是Ctrl+s命令在linux下是取消回显命令,所键入字符不显示在屏幕上,按Ctrl+q即可恢复回显。
问题2:在启动vim时,没有键入文件名。vim默认会创建一个新的文件,编辑完成后,进入命令状态,键入:w filename,将其保存为filename。
问题3:vim非正常退出后,再次编辑该文件时,会出现“swap file .helloworld.c.swp already exists!”的提示(假设helloworld.c是vim非正常退出时编辑的文件名),使用rm .helloworld.c.swp删除该文件,重新编辑即可。
2 Linux下C程序开发
C语言的编译器被简称为cc,不同厂商的类UNIX系统所带的C语言编译器均包含不同的功能和选项。Linux系统中,通常使用GNU C编译器,简称为gcc,下面以HelloWorld为例,简单介绍Linux下C语言开发过程。
注:本实验环境需要gcc版本为4.8以上。(可使用gcc -v查看gcc版本)
2.1 简要C语言开发过程
step1:使用vim编辑hello.c
#include <stdio.h> #include <stdlib.h> int main() { printf("Hello World \n"); return 0; }
step2:编译hello.c
gcc -o hello hello.c
gcc命令将hello.c编译成可执行文件hello,如不加-o选项,编译器会把编译后的可执行文件命名为a.out。
step3:执行hello
./hello
在hello前面添加./,是让shell在当前目录下寻找可执行文件,如不添加./,shell会在PATH环境变量设置的目录中去寻找该可执行文件,但这些目录中通常不会包含当前目录。
注:对于复杂的大型程序,一般编写makefile文件来进行编译链接,makefile文件的编写请参考相关资料。
1.1 gcc常用选项
gcc选项很多,下表列出gcc常用的一些选项。
表2 gcc常用选项
选项 |
说明 |
-c |
只做预处理、编译和汇编,不作链接,常用于不含main的子程序 |
-S |
只进行预处理和编译,生成.s汇编文件 |
-o |
指定输出的目标文件名 |
-Idir |
头文件搜索路径中添加目录dir |
-Ldir |
库文件搜索路径中添加目录dir |
-lname |
链接libname.so库来编译程序 |
-g |
编译器编译时加入debug信息,供gdb使用 |
-O[0~3] |
编译器优化,数字越大,优化级别越高,0表示不优化 |
2 使用gdb调试C程序
gdb是Unix/Linux下的一个功能强大的程序调试工具。当程序出现段错误(segment fault)或者逻辑错误时,可以使用gdb进行调试。
gdb主要有四大功能:
1、启动程序,可以按照自定义要求随心所欲的运行程序;
2、可让被调试程序在所指定的调置断点处停住(断点可以是条件表达式);
3、当程序被停住时,可以检查程序中所发生的事;
4、动态改变程序的执行环境。
2.1 gdb常用调试命令
可以使用#gdb program启动目标代码进行调试,但目标代码编译时,必须使用-g选项编译。进入调试界面后,可以输入相关gdb命令控制目标代码的运行。下表为gdb常用的调试命令。
表3 gdb常用调试命令
命令 |
说明 |
list(或l) |
列出源代码,接着上次位置往下列,每次列10行 |
list 行号 |
从给定行号开始列出源代码 |
list 函数名 |
列出某个函数的源代码 |
break(或b)行号 |
在给定行号出设置断点,gdb会给出一个断点号 |
break 函数名 |
在给定函数开头设置断点 |
delete breakpoint 断点号 |
删除给定的断点 |
start |
开始执行程序,停在main函数第一句前面等待命令 |
run(或r) |
开始执行程序,直到遇到断点 |
next(或n) |
执行下一条语句 |
step(或s) |
执行下一条语句,如是函数调用,则进入函数中 |
continue(或c) |
继续执行程序,直到遇到断点 |
finish |
连续运行到当前函数返回,然后停下来等待命令 |
print(或p) |
打印表达式的值 |
display 变量名 |
跟踪查看某个变量的值,每次停下来都显示该变量的值 |
undisplay 跟踪显示号 |
取消对变量的跟踪查看 |
set var |
修改变量的值 |
quit |
退出gdb |
2.2 gdb调试示例
下面以一个例子简要说明使用gdb的调试过程。
step1:编辑源代码tst_gdb.c
#include <stdio.h> int add() { int sum =0, i; for(i = 0; i < 10; i ++) { sum += i; } return sum; } int main() { int result = 0; result = add(); printf(“the result is %d \n”, result); return 0; }
step2:编译链接源代码,形成目标代码,注意使用-g编译选项。
gcc -g -o tst_gdb tst_gdb.c
step3:使用gdb进行跟踪调试,如下图所示。
这里再给出一张图片作为说明。