实验五常用软件开发工具_第1页
实验五常用软件开发工具_第2页
实验五常用软件开发工具_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验五、常用软件开发工具一、实验目的1、 熟悉字符模式下的 C程序编译和调试环境,基本掌握Linux字符模式下的编译工具和调试工具的使用;2、 本实验需要综合使用Linux基本文件命令、编辑器的使用,练习在 Linux的字符模式下,编辑、编译及调试一个C程序的基本方法。二、实验内容和步骤1 gcc和g+语言编译器GCC是GNU Compiler Collection 的缩写,它是世界上最为重要的开放源代码软件18。因为所有其他的开放源代码项目都依赖于GCC进行编译。比如,没有 GCC Linux的产生就不会成为可能。GCC能工作在很多平台上,这里所说的平台是指计算机硬件芯片和运行在其上的操作系

2、统的组合。下表是GCC1行的平台。表GCC运行的平台硬件操作系统AlphaRed Hat Li nux 7.1HPPAHPUX 11.0In tel x86Debia n Li nux 2.2, Red Hat Li nux 6.2,FreeBSD 4.5MIPSIRIX 6.5PowerPCSparcSolaris 2.7GCC可以编译多种语言:C, C+,对象C (标准C的派生),Fortran , Java, Ada。正如GCC缩写所代表的对象一样,GCC实际上是多种编译器的统称,gcc是所有编译器的统一的程序接口,在本书中,并没有区分GCC和gcc。同时,GCC也能够进行代码优化,提高

3、执行程序的运行速度。g+是构建于gcc基础上的C+语言编译器。gcc编译过程分为4个阶段:l预处理l编译l汇编 l连接 最简单的C语言编译的例子:用vi建立一个hello.c文件$vi hellox输入字符i,插入文本以下文本#include int main(void)printf (” Hello World!n); return 0;最后输入字符:wq,返回命令行,键入以下编译命令$gcc hello.c (-lstdc+)如果没有错误gcc将生成默认的可执行文件a.out ,执行a.out:$./a.outHello World!$gcc带有多达数页的编译选项,我们仅列出最常用的几项:

4、-o可执行文件名指定输出的可执行文件名,而不是默认的-c只编译生成.o的目标文件,不连接生成可执行文件-s只编译生成.s的汇编文件,不连接生成可执行文件-g在可执行文件中加入标准调试信息-Wall允许GCC发出警告型错误信息选项使用的例子:对以上hello.c使用-o,-g常用选项重新编译、执行:$gcc -g hello.c -o hello$./helloHello World!$GCC默认的扩展文件名:.c C语言源代码.C .cc C+语言源代码.i预处理后的C语言源代码.ii预处理后的C+语言源代码.S .s汇编语言源代码.o编译后的目标代码.a.so编译后的库代码下面的例子由两个文

5、件组成:mai n.c, calc.c ,其中,mai n.c#indude int calc(int);int main(int argcT char* argv)int iIn put=O, iOutput=0;int i=0;scan f(%i, & iI nput);while(il nput 0)prin tf(Please in put a positive in teger!n); scan f(%i, &iI nput);iOutput = calc(i In put);prin tf(Result is:%in, iOutput); return 0;a.out文件内容为:c

6、alc.c的文件内容为:#i n elude int calc(i nt iln) Iint i = 0, iOut = 0;iOut = iln;for(i = 0; i iln; i+)iOut += iOut * il n;return iOut;I1、编译过程有三种方式编译这两个源程序,一是直接使用如下命令行完成编译、链接过程:$gcc mai n.c calc.c -o main命令行中,ma in .c calc.c的后缀名指明了调用c编译器,前面讲到了gcc是GCC的众多编译器的统一入口,gcc靠后缀名决定调用什么编译器,-o参数指定了可执行文件的文件名为main。第二种方法是编

7、译 calc.c为静态库,编译 ma in .c时指定静态库的位置。需要将calc.c编译成中间文件calc.o,使用如下命令行:$gcc -c calc.c生成静态库文件,添加calc.o到静态库中,使用如下命令行:$ar -r libcalc.a calc.o命令行中,-r libcalc.a参数表示建立静态库,名字为libcalc.a。接下来,使用如下命令行:$gcc mai n.c libcalc.a -o main上面这条命令也可以用下面的命令完成:$gcc mai n.c -lcalc o main-l参数可以指定库名称,这里calc表示使用库libcalc.a,库名字前面的lib

8、和后面 的.a被省略掉了,遵从了命名法。第三种方法是建立共享库,编译时指定共享库。首先,编译calc.c为calc.o,使用命令行:$gcc -c -fpic calc.c命令行中,-fpic指定calc.o为可重分配地址属性,pic是position independenee code的缩写。接下来使用 calc.o生成共享库 calc.so :$gcc -shared calc.o-o calc.so这两条命令也可以缩减为一行:$gcc -shared -fpic calc.c -o calc.so最后编译main.c ,链接生成的共享库$gcc mai n.c calc.so -o ma

9、in2 make项目管理器make项目管理器(GNU中的名称为gmake )可以根据项目开发者说明的项目开 发文件Makefile自 动的进行编译配置和重复编译 ,能实现复杂项目的编译自动化。项目开发文件 Makefile的编写使用以下规则:目标体1:依赖体1 依赖体2 .命令行1命令行2目标体2 :依赖体1 依赖体2 .命令行1命令行2.其中目标体是命令行要生成的输出文件,依赖体是命令行要输入的文件或选项,命令行序列是要创建目标体文件所需要的步骤,例如编译命令。无特别指定,make总是使用当前目录中的Makefile进行自动编译。例如我们在当前目录中有两个项目开发文件hello.c和hell

10、o.h,贝U Makefile文件可以编写为:hello: hello.ogcc hello.o -o hello hello.o: hello.c hello.h gcc -c hello.c clean:rm hello *.omake命令的使用:$g make输入 make或make hello将生成 Makefile中所有的目标文件,即hello,hello.o,hello.s。$g make hello.o将仅生成目标文件hello.o$g make clea n是一条伪目标生成命令,该目标没有依赖体,它只执行对已生成目标文件的删除。当我们对以上依赖体中的任意一个进行了修改,重新ma

11、ke时仅会引发对应目标体的重新生成,从而提高了编译的效率并保证了项目开发的正确性。3 gdb程序调试器GDB 是 GNU Project Debugger 的缩写,用于调试 Ada, C, C+, Objective-C, Pascal 和其他语言编写的程序20,这些程序可以运行在本地计算机上,也可以运行在远程计算机上。GDB可以运行在几乎所有的UNIX和微软 Windows平台上。GDB主要能做下面4种事(以及由它们所支持的其他事情):1)启动程序,指定可能影响程序运行的任何条件;2)指定程序在一定条件下停止;3)检查当程序停止时发生的事情;4) 通过改变程序中的某些条件,测试可能造成的软件

12、错误,还可以由此学习其他的软件错误。GDB可以做源代码级别的程序调试(需要在编译时指定相应条件),也可以做二进制级别的程序调试。可以使用gdb跟踪调试,观察到它的高级语言源代码的执行过程和变量的中间结果,从而能快速的排除程序运行时发生的错误。以下是一个带有运行时错误的C程序,注意程序想通过传地址方式在一个函数中为字符变量C赋一个字符,但它引用了一个空指针,这将引发运行时的段非法错误使得程序异常终止。但我们可以通过gdb跟踪到它产生错误的位置,从而分析出产生错误的原因。/*I* debugmy.c7#i n elude void myputc(char * cptr)*cptr = a;prin

13、 tf(myputc=%c n,*cptr);int main( void)char c;char * cptr;c = A :myputc(cptr);return 0;使用带-g选项的gcc编译、执行:$gcc -g debugmy.c -o debugmy$ ./debugmy段错误$使用gdb跟踪查错$ gdb ./debugmyGNU gdb Red Hat Linux (630.0-1.122rh)Copyright 2004 Free Software Foun dati on, Inc.GDB is free software, covered by the GNU Gen e

14、ral Public Lice n se, and you are welcome to cha nge it an d/or distribute copies of it un der certa in con diti ons.Type show copy in g to see the con diti ons.There is absolutely no warra nty for GDB.Type show warra n ty for details.This GDB was con figured as i386-redhat-l inu x-g nu .Us ing host

15、 libthread_db library /lib/libthread_db.so.1.(gdb)Gdb常现在进入了gdb调试状态,可以使用gdb的调试 子 命令跟踪程序的执行 用命令:list 行号列出指定行号的上下行(缺省为10行) break 源程序文件名:行号 建立一个断点run启动被调试的程序next从断点处向下执行一行step从断点处向下执行一行,当前行为函数则跟踪进入函数contin ue继续从断点处连续执行print变量名打印变量当前值quit 退出 gdb(gdb)list 10567891011121314让我们现使用list命令查看一下要调试的程序是否已经装入,输入:v

16、oid myputc(char * cptr)*cptr = a;prin tf(myputc=%cn,*cptr);int main( void)char c;char * cptr;c = A:我们将断点设在第15行上,输入:(gdb) break 15Breakpoi nt 1 at 0x80483c0: file debugmy.c, li ne 15.开始跟踪执行,输入:(gdb) runStart ing program: /root/ipc/debugmyRead ing symbols from shared object read from target memory.do ne.Loaded system supplied DSO at OxffffeOOOBreakpo int 1, mai n () at debugmy.c:1515myputc(cptr);程序执行到第15行上停止,我们采用单步执行跟踪错误的发生,输入:(gdb) stepmyputc (cptr=0x9bbe40 U211?WVS203? L? 215s) at debugmy.c:77*cptr = a;程序执行一行,进入函数myputc,再单

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论