LINUX编程-实验三

更新时间:2023-09-10 09:36:01 阅读量:1 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

试验编号: _03_

四川师大 实验报告 2010 年 10

月 16日

计算机科学学院 2008 级3 班

姓名:余乐坤 学号:2008110359 指导老师: 实验成绩:

实验三 Linux程序设计入门

1. 目的要求

(1) 掌握利用文本编辑工具,生成源文件。

(2) 掌握利用GCC编译工具,编译、连接生成可执行文件。 (3) 能读懂Makefile文件,并能编写简单的Makefile文件。 (4) 掌握利用GDB调试工具,调试可执行文件。 2. 实验内容

(1)编译源文件的练习

? 在/root目录下创建目录,目录名:LinuxProgram。

? 在LinuxProgram下,利用文本编辑器创建hello.c源文件。 ?

手动编译hello.c源文件,并运行。

[root@local]$gcc hello.o –o hello [root@local]$ gcc –c hello.c [root@local]$./hello

修改hello.c文件后,手动重新编译、运行。

? 在hello.c中,修改printf(“Welcome you , Emdoor!\\n”)。 ? 删除目标文件、可执行文件。 [root@local]$rm –f hello.o [root@local]$rm –f hello ? 编译后,重新运行。

[root@local]$ gcc –c hello.o –o hello [root@local]$./hello

利用GNU make ,自动编译hello.c

? 利用vi创建Makefile文件,并将其保存在与hello.c相同的目录下。

?

?

? 利用GNU make编译并运行

[root@local]$make

[root@local]$./hello

? 修改hello.c文件后,自动重新编译、运行 在hello.c中,修改printf(“Welcome you , Emdoor!\\n”)

[root@local]$make clean [root@local]$make

[root@local]$./hello

思考:比较手动、自动编译之间的区别,并解释$^ 、$@、$<的含义。

___手动编译时每一个被修改的文件都要被重新编译,然后再链接,工作量大,而自动编会根据文件时间戳自动编译被修改的文件然后链接,工作量少。

__________________________________________________________________________$^:所有不重复的依赖文件,以空格分开; ___$@:目标文件的完整名称; ___$<:第一个依赖文件的名称

__________________________________________________________________________________________________________ ?

多个源文件的编译

? 利用vi创建Makefile文件,并将其保存在与hello.c相同的目录下。

? ?

? ?

? 利用GNU make编译并运行

[root@local]$make

[root@local]$./hello

? 查看并记录所生成的文件和运行的结果,为Makefile文件每行添加注释。

_______________________________________________________________________#makefile test for multi files program #written by Emdoor

CC=gcc #为变量CC赋值为gcc CFLAGS= # 为变量CFLAGS赋值空

OBJS=hello1.o hello2.o #为变量OBJS赋值hello1.o hello2.o all: hello #目标文件all依赖于文件hello

_________hello:$(OBJS)______________#目标文件hello 依赖由变量OBJS 定义的文件 _________ $(CC) $(FLAGS) $^ -o $@ #由所有依赖文件链接成目标文件 hello1.o:hello1.c #hello1.o依赖于hello1.c文件

$(CC) $(CFLAGS) -c $< -o $@ #依赖文件列表中的第一个文件编译成目标文件

Hello2.o:hello2.c

$(CC) $(CFLAGS) -c $< -o $@ #依赖文件列表中的第一个文件编译成目标文件

_______________________________________________________________________________

? 修改Makefile文件

? 利用GNU make编译并运行 [root@local]$make

[root@local]$./hello

? 查看并记录所生成的文件和运行的结果,为Makefile文件每行添加注释。

__CC=gcc______________________________#给变量赋值为gcc

__CFLAGS=____________________________#给变量赋值为空 __ CFILES=$(wildcard *.c ) ____________ #将所有以C为后缀的文件的列表赋给变量CFILES

_______________________________________________________________________OBJS=$(CFILES : %c=%o )

__________#_____________________________________________________________all:hello #目标文件all依赖于文件Hello

hello : $(OBJS) #目标文件hello依赖于OBJS变量的值。

$(CC) $(CFLAGS) -o hello $(OBJS) #以变量OBJS的值生成文件hello _.c.o:

$(CC) –c $< #以依赖文件中的第一个文件编译成目标文件

_________________________________________________________________clean:________________________________________________________________rm –rf hello*.o # _运行make clean 时删除 以hello开头的后缀为o的文件 。

____________________________________________________________________________________________________

(2)GDB/Debugger调试工具使用

利用vi编辑源文件bubble.c 编译源文件,并启动GDB

[root@local]#gcc -g -o bubble bubble.c [root@local]#gdb bubble 查看当前源程序的信息 (gdb) info source

Current source file is bubble.c

Compilation directory is /root/sample Located in /root/sample/bubble.c Contains 32 lines. Source language is c.

Compiled with DWARF 2 debugging format. Does not include preprocessor macro info.

注释输出的信息含义:

_ Current source file is bubble.c 当前调式文件的原文件名字bubble.c Compilation directory is /root/sample 当前编辑目录是/root/sampl Located in /root/sample/bubble.c

文件路径

Contains 32 lines. 文件共有32行

Source language is c. 程序编辑语言是C语言

Compiled with DWARF 2 debugging format. 编译器使用 DWARF 2 调试表格式。

Does not include preprocessor macro info. 不包括预处理宏信息

_____________________________________________________________________________________________________________

在函数swap、main处,设置断点。 (gdb) br swap

Breakpoint 1 at 0x80483d6: file bubble.c, line 11. (gdb) br 23

Breakpoint 2 at 0x804844a: file bubble.c, line 23.

查看断点信息

(gdb) info br

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804832e in swap at bubble.c:11 2 breakpoint keep y 0x08048390 in main at bubble.c:23

如果希望删除在main函数上的断点,命令是: ? (gdb) del 2 ? (gdb) info br

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804832e in swap at bubble.c:11

如果希望断点设在循环中且不被频繁断下,命令是: ? (gdb) del 2 ? (gdb) info br

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804832e in swap at bubble.c:11

? (gdb) br 23 if j==5

Breakpoint 3 at 0x8048390: file bubble.c, line 23.

? (gdb) info br

Num Type Disp Enb Address What

1 breakpoint keep y 0x0804832e in swap at bubble.c:11

3 breakpoint keep y 0x08048390 in main at bubble.c:23 stop only if j == 5

执行程序。

(gdb) run

Starting program: /root/sample/bubble

Breakpoint 1, swap (x=0x8049524, y=0x8049520) at bubble.c:11 11 temp = *x;

程序已经在断点1停了下来。查看变量值x。

(gdb) p x

$1 = (int *) 0x8049524 #x是一个指向整数的指针,指针值是0x80495a4。 (gdb) p *x $2 = 32

(gdb) p *y

$3 = 69 单步执行

(gdb) n 12 *x = *y;

(gdb) p temp #查看变量temp值 $4 = 32 (gdb) n

13 *y = temp; (gdb) p *x

$5 = 69

(gdb) del 1 #删除断点1

(gdb) cont #继续执行 Continuing.

Breakpoint 3, main () at bubble.c:23 #当j=5,在断点3停下 23 swap(&record[j],&record[j-1]);

(gdb) p j $6 = 5 查看排序结果

(gdb) p record

$7 = {12, 76, 48, 62, 94, 17, 32, 37, 52, 69}

请写出record数组在运行前后的结果,对比后评价程序是否运行正常?

__________

__________________________

________________________________________________________________________________程序运行有错误 ____ ________________________________________________________________________________________________ 3. 主要仪器设备及软件

(1) 硬件:计算机、网络

(2) 软件:VMWare workstation、RedHat 9.0 4. 附录:程序清单

1) hello.c #include

int main()

2)

{

printf(\ return 1; }

hello1.c

#include int main() { }

printf(\test2(); return 1;

3) hello2.c #include \

#include void test2(void) { }

printf(\–hello2\\n\

4) hello2.h

void test2(void);

bubble.c

#include

#define MAX_RECORD_NUMBER 10

int record[MAX_RECORD_NUMBER] ={12,76,48,62,94,17,37,52,69,32}; void swap(int * x , int * y ) { }

int temp; temp = *x; *x = *y; *y = temp;

5)

int main() {

int i,j;

for( i = 0 ; i < MAX_RECORD_NUMBER-1; i++ ) {

for( j = MAX_RECORD_NUMBER -1; j > i; j--) if( record[j] < record[j-1] ) swap(&record[j],&record[j-1]);

}

for( i = 0; i < MAX_RECORD_NUMBER-1; i++) printf(\printf(\

}

return 1;

本文来源:https://www.bwwdw.com/article/i4qh.html

微信扫码分享

《LINUX编程-实验三.doc》
将本文的Word文档下载到电脑,方便收藏和打印
推荐度:
点击下载文档
下载全文
范文搜索
下载文档
Top