Linux下C语言开发基础实验内容

目录

1、linux下C语言开发流程

2、vi,vim编辑器的使用

3、Gcc编译器的使用

总体选项:

警告选项:

4、GDB 基本命令的使用

         5、Make 工程管理器的使用

1、Linux下C语言开发流程
(1)启动虚拟机,进入Linux操作系统,然后启动终端。

(2)使用Vim 编辑源程序,在终端中输入vi hello.c,然后输入源代码,编辑完成后存盘。

(3)编译源代码,在终端下输入gcc hello.c–o hello进行编译。

(4)运行程序,在终端中查看程序运行结果

include

void main()
{
printf(“I am a haoren\n”);
}
在终端输入” gcc hello.c -o hello”,编译完成后,输入”./hello”

效果图如下

2、vi,vim编辑器的使用
(1)Vim 的启动。

(2)三种模式:命令模式、编辑模式、底行模式之间的切换,以及三种模式下的常用命令的使用。参考教材中命令行模式和底行模式下的常见功能键完成如下操作练习。

Ø 在“/root”目录下建一个名为“Vi”的目录。mkdir /tmp/Vi

Ø 进入“Vi”目录。cd /tmp/Vi

Ø 将文件“/etc/inittab”复制到“/Vi”目录下。cp /etc/inittab ./     ;有些Linux系统中可能没有inittab文件,可以先cd /etc进入etc目录,输入命令“ls -l” 查看自己是否具有inittab,若没有,可以用其他文件代替,也可以自己创建一个文件。

Ø 使用Vi 打开“Vi”目录下的inittab。

Ø 设定行号,指出设定initdefault(类似于“id:5:initdefault”)的所在行号。:set nu

Ø 将光标移到该行。17

Ø 复制该行内容。yy

Ø 将光标移到最后一行行首。G

Ø 粘贴复制行的内容。p

Ø 撤销第9 步的动作。u

Ø 将光标移动到最后一行的行尾。$

Ø 粘贴复制行的内容。p

Ø 光标移到“si::sysinit:/etc/rc.d/rc.sysinit”。21G

Ø 删除该行。dd

Ø 存盘但不退出。:w(底行模式)

Ø 将光标移到首行。1G

Ø 插入模式下输入“Hello,this is Vi world!”。按i 键并输入“Hello,this is Vi world!”(插

入模式)

Ø 返回命令行模式。Esc

Ø 向下查找字符串“0:wait”。/0:wait(命令行模式)

Ø 再向上查找字符串“halt”。?halt

Ø 强制退出Vi,不存盘。:q!(底行模式)

3、Gcc编译器的使用
参考教材中gcc的命令和编译选项,构造实验测试总体选项、警告和出错选项以及优化选项的编译。效果。

总体选项:
首先在一个“srv”目录中创建一个.c文件(qwe.c),然后用vi进入qwe.c进行编辑,代码如下:

include

void main()
{
printf(“I am a student!\n”);
}
预处理阶段:gcc -E qwe.c -o qwe.i

编译阶段:gcc -S qwe.i -0 qwe.s

汇编阶段:gcc -c qwe.s -o qwe.o

链接阶段:gcc qwe.o -o qwe

效果如下:

警告选项:
判断你的代码是否有问题的一个重要的指标,可以让你的代码越来越完美,成为一个越来越优秀的工程师。

以这个代码为例:

include

void main(void)
{
long long tmp = 1;
printf(“This is a bad code!\n”);
}
 

1. Wall类警告提示

这一类警告提示选项占了GCC警告选项的90%以上,它不仅包含打开所有警告等功能,还可以单独对常见错误分别指定警告。

在命令行输入以下代码:

root@ubuntu:/srv#  gcc -Wall wrong.c -o wrong

wrong.c:4:warning:return type of’main’is not’int’

wrong.c:In function’main’:

wrong.c:5:warning:unused variable’tmp’

从这里可以看出:使用”-Wall”选项找出了未使用的变量tmp以及返回值的问题,但没有找出无效数据类型的错误。

2. 非Wall类警告提示

非Wall类的警告提示中最为常用的有以下两种:“-ansi”和“-pedantic”。

(1)“-ansi”

该选项强制GCC生成标准语法所要求的告警信息,尽管这还并不能保证所有没有警告的程序都是符合ANSIC标准的。

在命令行输入以下代码:

root@ubuntu:/srv# gcc -ansi wrong.c -o wrong

wrong.c:In function’main’:

wrong.c:4:warning:return type of’main’is not’int’

从这里可以看出:该选项并没有发现“long long”这个无效数据类型的错误。

(2)“-pedantic”

该选项允许发出ANSIC标准所列的全部警告信息,同样也保证所有没有警告的程序都是符合ANSIC标准的。

在命令行输入以下代码:

root@ubuntu:/srv# gcc -pedantic wrong.c -o wrong

wrong.c:In function’main’:

wrong.c:5:warning:ISO C90 does not support’long long’

wrong.c:4:warning:return type of’main’is not’int’

从这里可以看出:使用该选项查看出了“long long”这个无效数据类型的错误。

4、GDB 基本命令的使用
gdb 所提供的功能,使用Vim 编辑源程序,在终端中输入vi test.c,输入如下源代码,编辑完成后存盘。此代码的功能为输出倒序main 函数中定义的字符串,但结果没有输出显示,现通过调试的方式来解决程序中存在的问题。

例子:未调试的源代码如下

include

include

include

int display1 (char *string);
int display2 (char *string1);
int main ()
{
char string[] = “Embedded Linux”;
display1 (string);
display2 (string);
}
int display1 (char *string)
{
printf (“The original string is %s \n”, string);
}
int display2 (char *string1)
{
char *string2;
int size,i;
size = strlen (string1);
string2 = (char *) malloc (size + 1);
for (i = 0; i < size; i++)
string2[size – i] = string1[i];
string2[size+1] = ‘ ‘;
printf(“The string afterward is %s\n”,string2);
}
(1)用Gcc 编译:gcc -g greet.c -o greet

(2)运行greet:./greet,输出为:

The original string is Embedded Linux

The string afterward is

可见,该程序没有能够倒序输出。

(3)启动Gdb 调试:gdb greet

<1>查看源代码:l

<2>在21 行(for 循环处)设置断点:b 21 ;for循环在哪一行断点设置在哪一行

<3>在24 行(printf 函数处)设置断点:b 24。

<4>查看断点设置情况:info b

 <5>运行代码:r

<6>单步运行代码:n

<7>查看暂停点变量值:p string2[size – i]

<8>继续单步运行代码数次,并使用命令查看,发现string2[size-1]的值正确

<9>继续程序的运行:c

<10>程序在printf 前停止运行,此时依次查看string2[0]、string2[1]…,发现string[0]没有被正确赋值,而后面的复制都是正确的,这时,定位程序第31 行,发现程序运行结果错误的原因在于“size-1”。由于i 只能增到“size-1”,这样string2[0]就永远不能被赋值而保持NULL,故输不出任何结果。

<11>退出Gdb:q

<12>重新编辑greet.c,把其中的“string2[size – i] = string1[i]”改为“string2[size – i – 1] =string1[i];”即可。使用Gcc 重新编译,查看运行结果:./greet

The original string is Embedded Linux

The string afterward is xuniL deddedbmE

这时,输入结果正确。

5、Make 工程管理器的使用
(1)编辑源代码,利用文本编辑器vi在“media”目录下创建hello5.c 文件,vi hello5.c

include

int main()
{
printf(“Welcome Emdoor!\n”);
return 1;
}
(2)编写makefile文件,利用文本编辑器创建一个makefile文件,并将其保存到与hello5.c 相同的目录下(一定要在相同的目录下)

CC=gcc
CFLAGS=
all: hello
hello:hello.o
$(CC) $(CFLAGS) hello.o –o hello
hello.o:hello.c
$(CC) $(CFLAGS) –c hello.c –o hello.o
clean:
(3)执行make,查看并记录所生成的文件和运行的结果。

各位观众老爷点个赞!!!

 
————————————————

原创文章,作者:Zhu, Yuanyuan,如若转载,请注明出处:https://www.yidc.net/archives/16422