LINUX实验三
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
北京林业大学
2013学年—2014学年第2学期Linux应用实验任务书专业名称:班级:
姓名:学号:
实验题目:实验三GNU下编译器和调试器的使用初步
实验环境:Linux环境
实验目的:
通过调试一个有问题的程序,进一步熟练使用Vi操作,而且熟练掌握Gcc 编译及Gdb的调试命令,通过对有问题程序的跟踪调试,进一步提高发现问题和解决问题的能力。
实验内容:
GNU GCC:
编译单个源文件
#include
#include
int main(int argc,char**argv)
{printf(“Hello world!\n”);
exit(0);
}
输入:wq保存并退出
用gcc编译
简单编译两个源文件
#include
void goodbye_world(void);
{printf(“Goodbye,world!\n”);
}
使用gcc的“-c”标记来编译支持库代码:
#gcc-c文件名.c
这一过程的输出结果是一个名为文件名.o的文件,它包含适合连接到一个较大程序的已编译目标代码。
创建一个简单的示例程序,它包含一个调用上个程序里的goodbye_world的main 函数。
#include
void goodbye_world(void);
int main(int argc,char**argv)
{goodbye_world();
exit(0);
}
使用gcc编译这个程序:
#gcc-c main.c
现在有了两个目标文件:message.o和main.o。它们包含能够被Linux执行的目标代码。要从这个目标代码创建Linux可执行程序,需要再一次调用gcc 来执行连接阶段的工作:
使用外部函数库
GCC常常与包含标准例程的外部软件库结合使用,几乎每一个Linux应用程序都依赖于由GNU C函数库GLIBC。
//请编写代码计算sin30度+sin60度+sin90度,并完成编译,执行
提示:头文件的使用且GCC编译时使用数学库参数。函数库位置随系统的不同而不同,但它一般会位于目录/lib或/usr/lib中,在这些目录中还有数以百计的其他必需的系统函数库。
GNU GDB:
(1)使用Vi编辑器,将以下代码输入到名为greet.c的文件中。此代码的
原意为输出倒序main函数中定义的字符串,但结果显示没有输出。代码
如下所示:
(2)使用Gcc编译这段代码。
(3)运行生成的可执行文件,观察运行结果。
(4)使用Gdb调试程序,通过设置断点、单步跟踪,一步步找出错误所在。
(5)纠正错误,更改源程序并得到正确的结果。
实验步骤:
(1)在工作目录上新建文件greet.c,并用Vi启动:vi greet.c。
(2)在Vi中输入以上代码。
图1
(3)在Vi中保存并退出:wq。
(4)用Gcc编译:
(5)运行greet:./greet,输出为:
可见,该程序没有能够倒序输出。
(6)启动Gdb调试:
(7)查看源代码并进行调试。
将原来有错的程序经过Gdb 调试,找出问题所在,并修改源代码,输出正确的倒序显示字符串的结果。实验步骤中请适当截图。GNU 调试器是一个功能非常强大的工具。要了解更加详尽的知识,建议阅读GNU 调试器手册。LINUX 环境下的编程实现:
请用深度优先搜索或广度优先搜索对上图的文件系统树进行遍历。#include
#include
#include
using namespace std;
void DFS(int G[8][8],int v);
int visit[8]={0,0,0,0,0,0,0,0};
string name[8]={"/","dirC","dirA","my3.dat","dirB",
"my1.dat","my2.dat","my1.dat"};
int main()
{
/*0
12
3456
7
*/
int G[8][8]={0,1,1,0,0,0,0,0,
0,0,0,1,0,0,0,0,
0,0,0,0,1,1,1,0,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,1,
0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,/
dirC dirA
dirB my3.dat my1.dat
my2.dat
my1.dat
0,0,0,0,0,0,0,0};
DFS(G,0);
return0;
}
void DFS(int G[8][8],int v)
{
int w=0;
cout<
visit[v]=1;
for(w=0;w<8;w++)
if((G[v][w]!=0)&&(visit[w]==0))
DFS(G,w);
}
实验中存在的问题及解决办法:
树的遍历使用VC6.0可编译运行,移植到Vi后出错。