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
printf(\test2(); return 1;
3) hello2.c #include \
#include
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;






正在阅读:
LINUX编程-实验三09-10
杭州市团务知识学习网 网上自测题及答案(5套,每套100题)05-27
商务翻译Unit 9 商务信函06-09
药房新入职员工岗前培训试题01-18
论语300讲(一)01-20
我的祖国作文500字04-01
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 编程
- 实验
- LINUX