实验四: LINUX 下 C 语言使用、编译与调试实验
、目的:
1、练习并掌握 Linux 提供的 vi 编辑器来编译 C 程序
2、学会利用 gcc、 gdb 编译、调试 C 程序
3、学会使用 make 工具
、内容
1、编写 C 语言程序,用 gcc 编译并观察编译后的结果,运行生成的可执行文件。
2、利用 gdb 调试程序。
3、学习编写 makefile ,并进行编译。
、操作
1、文件编辑器 vi
进入 vi ,直接执行 vi 编辑程序。
例: # vitest.c
显示器出现 vi 的编辑窗口,同时 vi 会将文件复制一份至缓冲区( buffer )。 vi 先对缓冲 区的文件进行编辑, 保留在磁盘中的文件则不变。 编辑完成后, 使用者可决定是否要取代原 来旧有的文件。
1)vi 的工作模式 (1)输入模式
ESC 可切换到命令模式。命令模式下,可选用下列指令离开vi:输入以下命令即可进入
ESC 可切换到命令模式。命令模式下,可选用下列指令离开
vi:
a
在光标之后加入资料
A i
I
在该行之末加入资料
在光标之前加入资料
在该行之首加入资料
o
新增一行于该行之下
O
2)命令模式
新增一行于该行之上
在输入模式下,按
:q! 离开 vi ,并放弃刚在缓冲区内编辑的内容
:wq 将缓冲区内的资料写入磁盘中,并离开 vi
ZZ 同 wq
: x 同 wq
:w 将缓冲区内的资料写入磁盘中,但并不离开 vi
:q 离开 vi ,若文件被修改过,则要被要求确认是否放弃修改的内容,此 指令可与: w 配合使用
3)命令模式下光标的移动
h
左移一个字符
j
下移一个字符
k
上移一个字符
l
右移一个字符
0(零)
移至该行的行首
$
移至该行的行尾
A
移至该行的第一个字符处
H
移至窗口的第一行
M
移至窗口中间那一行
L
移至窗口的最后一行
G
移至该文件的最后一行
W, w
下一个单词 (W 忽略符号 )
B, b
上一个单词 (B 忽略符号 )
(4) 命令模式下的编辑命令
dd
删除当前光标所在行
yy
复制当前光标所在行
p
将复制的内容粘贴在光标所在的位置后
P
将复制的内容粘贴在光标所在的位置前
x
删除当前光标字符
X
删除当前光标之前字符
u
撤消
?
重做
2、GNU C 编译器
1) 使用 gcc
通常后跟一些选项和文件名来使用gcc 编译器。 gcc 命令的基本用法如下:
gcc [options] [] 命令行选项指定的编译过程中的具体操作
2)gcc 常用选项 当不用任何选项编译一个程序时, gcc 将建立(假定编译成功)一个名为 a.out 的可执 行文件。
选项含义:
FILE 没-o FILE 指定输出文件名,在编译为目标代码时,这一选项不是必须的。如果 有指定,默认文件名是 a.out
FILE 没
例如,
gcc test.c
编译成功后,当前目录下就产生了一个a.out文件。
也可用-o选项来为即将产生的可执行文件指定一个文件名来代替a.out。
例如:
#gcc p count count.c
此时得到的可执行文件就不再是a.out,而是count。
-c GCC仅把源代码编译为目标代码。默认时GCC建立的目标代码文件有一个.o的
扩展名。
-E对文件进行预处理
-S对文件进行编译,生成汇编代码。
-O对源代码进行基本优化。这些优化在大多数情况下都会使程序执行得更快。
-g在可执行程序中包含标准调试信息。
-Wall允许发出GCC能提供的所有有用的警告,也可以用-W(warning)来标识指定的
警口。
-I name链接静态库
-L dir库文件的搜索路径
执行文件
格式:./可执行文件名
例:
./a.out
./co unt
例子
mypow.c :定义 mypow()函数
un sig ned long long mypow( un sig ned int x, un sig ned int y)
{
un sig ned long long res=1;
if (y==0)
res = 1;
else if (y==1)
res = x;
else
res = x * mypow(x, y-1);
return res;
}
powtest.c :调用 mypow()函数 #i nclude
#i nclude
int main (i nt argc, char *argv[])
{
un sig ned int x, y;
un sig ned long long res;
if ((argc<3) || (ssca nf(argv[1], "%u", &x)) != 1