软件设计方法课程设计linux.docx
- 文档编号:11294534
- 上传时间:2023-02-26
- 格式:DOCX
- 页数:12
- 大小:22.01KB
软件设计方法课程设计linux.docx
《软件设计方法课程设计linux.docx》由会员分享,可在线阅读,更多相关《软件设计方法课程设计linux.docx(12页珍藏版)》请在冰豆网上搜索。
软件设计方法课程设计linux
实习报告
(2009—2010学年第2学期)
课程名称:
软件设计方法
班级:
学号:
姓名:
指导教师:
年月
一、目的
(1)、学习并掌握GCC编译程序过程和方法;GDB调试程序的方法和Make工程管理器的基本使用方法以及工程中文件和路径的安排;
(2)、学习安装Eclipse开发环境和Eclipse开发环境的使用;练习使用该软件实现相关程序功能。
二、内容和要求
(一)、基本要求
1、学习并掌握GCC编译程序过程和方法;
2、学习并掌握GDB调试程序的方法;
3、学习并掌握Make工程管理器的基本使用方法;
4、学习并掌握工程中,文件和路径的安排;
5、使用上述知识和技能,编写程序,完成实数的四则运算功能。
(二)、提高要求
1、安装Eclipse开发环境;
2、学习Eclipse开发环境的使用;
3、在Eclipse下,编写程序,完成实数的四则运算功能;
4、在Eclipse下,编写程序,完成1024点的FFT程序。
(三)、发挥部分
根据自己的程序开发水平,完成其他可展示功能程序。
三、过程(如实际程序开发、电子制作,详细说明有关原理、开发过程、调试过程、结果)
(一)、基本要求:
1、LinuxGCC编译过程
(1)、使用GCC编译程序时,编译过程可以被细分为四个阶段:
预处理(Pre-Processing):
这个过程处理宏定义和include,并做语法检查
编译(Compiling):
这个阶段,生成汇编代码
汇编(Assembling):
这个阶段,生成目标代码
链接(Linking):
链接过程。
生成可执行代码。
链接分为两种,一种是静态链接
◆预处理(Pre-Processing)
使用-E参数可以让GCC在预处理结束后停止编译过程:
#gcc-Ehello.c-ohello.i
◆编译(Compiling)
#gcc–Shello.c–ohello.s
◆汇编(Assembling)
下一步是将hello.s编译为目标代码,这可以通过使用-c参数来完成:
#gcc-xcpp-output–chello.i-ohello.o
或者
#gcc-chello.i-ohello.o
◆链接(Linking)
#gcchello.o-ohello
(2)、gcc主要参数:
-o定义输出文件
-E完成预处理/预编译停止
-S完成编译后停止,生成.s,不汇编
-c只汇编生成.o,不连接
-x指定编译步骤
-ggdb调试用,在可执行程序中包含标准调试信息
(3)、实例编译:
#vihello.c
#include
intmain(void)
{
printf("Helloworld,Linuxprogramming!
\n");
return0;
}
编译:
#gcc-Ehello.c-ohello.i
#gcc-Shello.i
#gcc-chello.s
#gcc hello.o-ohello
#./hello
Helloworld,Linuxprogramming!
2、Gdb调试程序
(1)、功能作用:
◆启动你的程序,可以按照你的自定义的要求的运行程序;
◆可让被调试的程序在你所指定的调置的断点处停住(断点可以是条件表达式);
◆当程序被停住时,可以检查此时你的程序中所发生的事;
◆动态的改变你程序的执行环境;
(2)、常用指令:
1)file命令:
装入想要调试的可执行文件。
2)cd命令:
改变工作目录。
3)pwd命令:
返回当前工作日录。
4)run命令:
执行当前被调试的程序。
5)kill命令:
停止正在调试的应用程序。
6)list命令:
列出正在调试的应用程序的源代码。
7)break命令:
设置断点。
8)tbreak命令;设置临时断点。
它的语法与break相同。
区别在于用tbreak设置的断点执行一次之后立即消失。
9)watch命令:
设置监视点,监视表达式的变化。
10)awatch命令:
设置读写监视点。
当要监视的表达式被读或写时将应用程序挂起。
它的语法与watch命令相同。
11)rwatch命令:
设置读监视点,当监视表达式被读时将程序挂起,等侍调试。
此命令的语法与watch相同。
12)next命令:
执行下一条源代码,但是不进入函数内部。
也就是说,将一条函数调用作为一条语句执行。
执行这个命令的前提是已经run,开始了代码的执行。
13)step命令:
执行下一条源代码,进入函数内部。
如果调用了某个函数,会跳到函数所在的代码中等候一步步执行。
执行这个命令的前提是已经用run开始执行代码。
14)display命令:
在应用程序每次停止运行时显示表达式的值。
15)infobreak命令:
显示当前断点列表,包括每个断点到达的次数。
16)infofiles命令:
显示调试文件的信息。
17)infofunc命令:
显示所有的函数名。
18)infolocal命令:
显示当前函数的所有局部变量的信息。
19)infoprog命令:
显示调试程序的执行状态。
20)print命令;显示表达式的值。
21)delete命令:
删除断点。
指定一个断点号码,则删除指定断点。
不指定参数则删除所有的断点。
22)Shell命令:
执行LinuxShell命令。
23)make命令:
不退出gdb而重新编译生成可执行文件。
24)quit命令:
退出gdb。
(3)、实例编译:
首先,打开Linux下的编辑器Vi,编辑如下代码:
/*test.c*/
#include
intsum(intm);
intmain()
{
inti,n=0;
sum(50);
for(i=1;i<=50;i++)
{
n+=i;
}
printf("Thesumof1-50is%d\n",n);
}
intsum(intm)
{
inti,n=0;
for(i=1;i<=m;i++)
n+=i;
printf("Thesumof1-mis%d\n",n);
}
在保存退出后首先使用gcc对test.c进行编译,注意一定要加上选项“-g”,这样编译出的可执行代码中才包含调试信息,否则之后gdb无法载入该可执行文件。
[root@localhostgdb]#gcc-gtest.c-otest
[root@localhostgdb]#gdbtest
接下来便可进行gdb各项指令的使用了
3、Make工程管理器的基本使用方法
(1)、基本知识:
一个简单的Makefile描述规则组成:
TARGET...:
PREREQUISITES...
COMMAND
...
target:
规则的目标。
通常是最后需要生成的文件名或者为了实现这个目的而必需的中间过程文件名。
可以是.o文件、也可以是最后的可执行程序的文件名等。
另外,目标也可以是一个make执行的动作的名称,如目标“clean”,我们称这样的目标是“伪目标”。
prerequisites:
规则的依赖。
生成规则目标所需要的文件名列表。
通常一个目标依赖于一个或者多个文件。
command:
规则的命令行。
是规则所要执行的动作(任意的shell命令或者是可在shell下执行的程序)。
它限定了make执行这条规则时所需要的动作。
注意:
每一个命令行必须以[Tab]字符开始,[Tab]字符告诉make此行是一个命令行,make按照命令完成相应的动作。
这是书写Makefile中容易产生,而且比较隐蔽的错误。
(2)、文件和路径的安排:
在一个较大的工程中,一般会将源代码和二进制文件(.o文件和可执行文件)安排在不同的目录来进行区分管理。
这种情况下,可以使用make提供的目录搜索依赖文件功能(在指定的若干个目录下自动搜索依赖文件)。
在Makefile中,使用依赖文件的目录搜索功能。
当工程的目录结构发生变化后,就可以做到不更改Makefile的规则,只更改依赖文件的搜索目录。
1、一般搜索(变量VPATH)
通过变量“VPATH”可以指定依赖文件的搜索路径,当规则的依赖文件在当前目录不存在时,make会在此变量所指定的目录下去寻找这些依赖文件。
通常我们都是用此变量来指定规则的依赖文件的搜索路径。
其实“VPATH”变量所指定的是Makefile中所有文件的搜索路径,包括了规则的依赖文件和目标文件。
定义变量“VPATH”时,使用空格或者冒号(:
)将多个需要搜索的目录分开。
make搜索目录的顺序是按照变量“VPATH”定义中的目录顺序进行的(当前目录永远是第一搜索目录)。
例如对变量的定义如下:
VPATH=src:
../headers
这样我们就为所有规则的依赖指定了两个搜索目录,“src”和“../headers”。
对于规则“foo:
foo.c”如果“foo.c”存在于“src”目录下,此规则等价于“foo:
src:
/foo.c”。
通过“VPATH”变量指定的路径在Makefile中对所有文件有效。
当需要为不类型的文件指定不同的搜索目录时,需要使用另外一种方式。
2、选择性搜索(关键字vpath)
另一个设置文件搜索路径的方法是使用make的“vpath”关键字。
它不是一个变量,而是一个make的关键字,它所实现的功能和上一小节提到的“VPATH”变量很类似,但是它更为灵活。
它可以为不同类型的文件(由文件名区分)指定不同的搜索目录。
它的使用方法有三种:
1、vpathPATTERNDIRECTORIES
为所有符合模式“PATTERN”的文件指定搜索目录“DIRECTORIES”。
多个目录使用空格或者冒号(:
)分开。
类似上一小节的“VPATH”变量。
2、vpathPATTERN
清除之前为符合模式“PATTERN”的文件设置的搜索路径。
3、vpath
清除所有已被设置的文件搜索路径。
vapth使用方法中的“PATTERN”需要包含模式字符“%”。
“%”意思是匹配一个或者多个字符,例如,“%.h”表示所有以“.h”结尾的文件。
如果在“PATTERN”中没有包含模式字符“%”,那么它就是一个明确的文件名,这样就是给定了此文件的所在目录,我们很少使用这种方式来为单独的一个文件指定搜索路径。
在“vpath”所指定的模式中我们可以使用反斜杠来对字符“%”进行引用(和其他的特使字符的引用一样)。
“PATTERN”表示了具有相同特征的一类文件,“DIRECTORIES”则指定了搜索此类文件目录。
当规则的依赖文件列表中的文件不能在当前目录下找到时,make程序将依次在“DIRECTORIES”所描述的目录下寻找此文件。
例如:
vpath%.h../headers
其含义是:
Makefile中出现的.h文件;如果不能在当前目录下找到,则到目录“../headers”下寻找。
注意:
这里指定的路径仅限于在Makefile文件内容中出现的.h文件。
并不能指定源文件中包含的头文件所在的路径(在.c源文件中所包含的头文件路径需要使用gcc的“-I”选项来指定)。
在Makefile中如果存在连续的多个vpath语句使用了相同的“PATTERN”,make就对这些vpath语句一个一个进行处理,搜索某种模式文件的目录将是所有的通过vpath指定的符合此模式的多个目录,其搜索目录的顺序由vpath语句在Makefile出现的先后次序来决定。
多个具有相同“PATTERN”的vpath语句之间相互独立。
下边是两种方式下,所有的.c文件的查找目录的顺序(不包含工作目录,对工作目录的搜索永远处于最优先地位)比较:
vpath%.cfoo
vpath%blish
vpath%.cbar
表示对所有的.c文件,make依次查找目录:
“foo”、blish”、“bar”。
而:
vpath%.cfoo:
bar
vpath%blish
对于所有的.c文件make将依次查找目录:
“foo”、“bar”、“blish”
(3)、递归调用:
make的递归过程指的是:
在Makefile中使用“make”作为一个命令来执行本身或者其它makefile文件的过程。
递归调用在一个存在有多级子目录的项目中非常有用。
例如,当前目录下存在一个“subdir”子目录,在这个子目录中有描述此目录编译规则的makefile文件,在执行make时需要从上层目录(当前目录)开始并完成它所有子目录的编译。
那么在当前目录下可以使用这样一个规则来实现对这个子目录的编译:
subsystem:
cdsubdir&&$(MAKE)
(4)、实例编译:
要求:
在home目录下创建std文件夹,用于存放sum、minus、multi、div四个文件夹以及main.c和makefile文件,其中sum等四个文件夹用于存放各自的.o、.h以及各自的makefile文件。
/*main.c*/:
#include
#include"add.h"
#include"minus.h"
#include"multi.h"
#include"div.h"
intmain()
{
floata;
floatb;
printf("请输入2个实数a和b(注意b不等于0):
\n");
scanf("%f%f",&a,&b);
printf("a+b=%f\n",add(a,b));
printf("a-b=%f\n",minus(a,b));
printf("a*b=%f\n",multi(a,b));
printf("a/b=%f\n",div(a,b));
return0;
}
Makefile编写:
vpath%add.csum
vpath%add.hsum
vpath%add.osum
vpath%minus.cminus
vpath%minus.hminus
vpath%minus.ominus
vpath%multi.cmulti
vpath%multi.hmulti
vpath%multi.omulti
vpath%div.cdiv
vpath%div.hdiv
vpath%div.odiv
obj=main.osum/add.ominus/minus.omulti/multi.odiv/div.o
XX文库-让每个人平等地提升自我
test:
$(obj)
gcc-o$@$(obj)
main.o:
main.cadd.hminus.hmulti.hdiv.h
gcc-c$<-Isum-Iminus-Imulti-Idiv
subsystem:
cdsum&&$(MAKE)
cdminus&&$(MAKE)
cdmulti&&$(MAKE)
cddiv&&$(MAKE)
(二)、Eclipse开发环境的使用
(1)启动Eclipse,选择File->New->Project;
(2)根据需要展开C或C++,选择其中的ManagedMakeCProject或ManagedMakeC++Project。
(3)输入工程的名称(注意不要使用中文名)后完成。
(4)进入C/C++透视图(Perspective)。
在左边的C/C++Projects视图中选择工程,新建文件(New->File),输入文件名。
在新窗口中输入程序的代码。
(5)调试运行。
四、小结
通过本次课程设计,我学到了很多软件开发相关知识。
首先我在Linux系统下进行练习,能够运用一些基本命令语句了。
然后我重点学习并掌握了GCC编译程序过程和方法;GDB调试程序的方法和Make工程管理器的基本使用方法以及工程中文件和路径的安排;最后我还了解并学习Eclipse开发环境的使用,在Eclipse下进行相关程序的调试运行。
在基本操作中,我结合老师所给的资料以及网上搜索,能够比较熟练地运用相关指令进行GCC和GDB的编译和使用。
Linux系统下的gcc(GNUCCompiler)是GNU推出的功能强大、性能优越的多平台编译器,可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。
GDB能让你观察另一个程序在执行时的内部活动,或程序出错时发生了什么。
在练习使用Make工程管理器时,开始对此较为陌生,无从下手,后来通过网上搜索相关教程以及实例,渐渐明白其中的规则。
由于在编写四则运算是要求将相关文件存放在指定目录中,所以要求掌握文件和路径的安排。
通过上网查找资料,学会了vpath的使用。
在学习Eclipse开发环境的使用中,我发现该软件的功能很强大,了解到Eclipse的内核很小,其他功能都是基于这个内核上的插件,如Eclipse自带的UNIT、ANT等。
而且Eclipse还开放了自己的插件机制,并提供了很好的插件开发环境,让用户可以自己来开发Eclipse的插件。
通过本次课程设计,我发现了自身存在的不足,并及时制定相关计划以补充学习;另外,我进一步了解到理论学习和实践操作的差距与联系;更重要的是,这一周的学习与实践,激发了我对软件开发的进一步学习的兴趣。
我想在今后的学习中,我会更深入地了解和学习软件开发的相关知识。
成绩
日期
批阅人
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 软件设计 方法 课程设计 linux