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

下载本文档

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

文档简介

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

2、上的操作系 统的组合。下表是 GCC运行的平台。表GCC运行的平台硬件操作系统Alp haRed Hat Li nux 7.1HPPAHPUX 11.0In tel x86Debia n Linux 2.2, Red Hat Li nux 6.2,FreeBSD 4.5MI PSIRIX 6.5Po werPCAIX4.3.3Sp areSolaris 2.7GC(可以编译多种语言:C, C+,对象C (标准C的派生),Fortran , Java,Ada。正如GCC缩写所代表的对象一样,GCC实际上是多种编译器的统称,gee是所有编译器的统一的程序接口,在本书中,并没有区分GCC和gee。同

3、时,GCC也能够进行代码优化,提高执行程序的运行速度。g+是构建于gee基础上的 C+语言编译器。geellll编译过程分为 4个阶段:预处理编译汇编连接 最简单的C语言编译的例子: 用vi建立一个 hello.e文件$vi hello.c I输入字符i,插入文本以下文本#in elude int main( void) 精选文库7最后输入字符:wq,返回命令行,键入以下编译命令:$gcc hello.c (-lstdc+)如果没有错误gcc将生成默认的可执行文件a.out,执行a.out:$./a.outHello World!$gcc带有多达数页的编译选项,我们仅列出最常用的几项:-o可执

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

5、两个文件组成:mai n.c, calc.c ,其中,ma in .c文件内容为:#in elude int calc(i nt);nt main (i nt argc, char* argv) scan f(%i, & il nput);While(il nput 0)printfCPI ease input a p ositive in teger!n);scan f(%i, &ilnput);iOut put = calc(i Inpu t);prin tf(Result is:%in, iOut put); return 0;calc.c的文件内容为:1、编译过程有三种方式编译这两个源

6、程序,一是直接使用如下命令行完成编译、链接过程:$gcc mai n.c calc.c -o main命令行中,main.c calc.c的后缀名指明了调用c编译器,前面讲到了 gcc是GCC的众多编译器的统一入口,gcc靠后缀名决定调用什么编译器,-0参数指定了可执行文件的文件名为ma in。第二种方法是编译 calc.c为静态库,编译main.c时指定静态库的位置。需要将calc.c编译成中间文件calc.o,使用如下命令行:$gcc -c calCC生成静态库文件,添加calc.o到静态库中,使用如下命令行:$ar -r libcaic.a caic.o命令行中,-r libcalc.a

7、参数表示建立静态库,名字为libcalc.a 。接下来,使用如下命令行:$gcc mai n.c libcaic.a -o main上面这条命令也可以用下面的命令完成:$gcc main.c -Icalc-l参数可以指定库名称,这里 的.a被省略掉了,遵从了命名法。第三种方法是建立共享库,编译时指定共享库。首先,编译calc.c为calc.o,使用命令行:-o maincalc表示使用库libcalc.a,库名字前面的lib和后面$gcc -C -fpic caic.c命令行中,-fpic 指定calc.o 为可重分配地址属性,Pic是position independence code 的缩

8、写。接下来使用calc.o 生成共享库calc.so :$gcc -shared calc.o - o calc.so这两条命令也可以缩减为一行:$gcc -shared -fpic calc.c -o calc.so 最后编译main.c ,链接生成的共享库:$gcc main .c caic.so -o main 2 make项目管理器的编写使用以下规则:依赖体2 .make项目管理器(GNU中的名称为 gmake)可以根据项目开发者说明的项目开 发文件 Makefile自动的进行编译配置和重复编译 ,能实现复杂项目的编译自动化。 项目开发文件 Makefile目标体1: 依赖体1命令行1

9、命令行2目标体2: 依赖体1命令行1命令行2其中目标体是命令行要生成的输出文件,依赖体是命令行要输入的文件或选项,命令行序列是要创建目标体文件所需要的步骤,例如编译命令。无特别指定,make总是使用当前目录中的Makefile进行自动编译。例如我们在当前目录中有两个项目开发文件hello.c和hello.h,贝U Makefile文件可以编写为:hello: hello.o |gcc hello.o -0 hellohello.o: hello.c hello.hIgcc -c hello.c Iclea n: |rm hello *.o Imake命令的使用:$g make输入make或ma

10、ke hello将生成 Makefile中所有的目标文件,即hello,hello.o,hello.s。$g make hello.o |将仅生成目标文件hello.o$g make clea n |是一条伪目标生成命令,该目标没有依赖体,它只执行对已生成目标文件的删除。当我们对以上依赖体中的任意一个进行了修改,重新make时仅会引发对应目标体的重新生成,从而提高了编译的效率并保证了项目开发的正确性。3 gdb程序调试器GDB 是 GNU Project Debugger 的缩写,用于调试 Ada, C, C+, Objective-C, Pascal 和其 他语言编写的程序20,这些程序可以

11、运行在本地计算机上,也可以运行在远程计算机上。GDB可以运行在几乎所有的 UNIX和微软Windows平台上。GDB主要能做下面4种事(以及由它们所支持的其他事情):1)启动程序,指定可能影响程序运行的任何条件;2)指定程序在一定条件下停止;3)检查当程序停止时发生的事情;4)通过改变程序中的某些条件,测试可能造成的软件错误,还可以由此学习其他的软 件错误。GDB可以做源代码级别的程序调试(需要在编译时指定相应条件),也可以做二进制级 别的程序调试。如果您在gcc编译选项中用到了 -g调试选项,则编译出的可执行文件就会带有符号表。这 样的程序就可以使用gdb跟踪调试,观察到它的高级语言源代码的

12、执行过程和变量的中间结果,从而能快速的排除程序运行时发生的错误。以下是一个带有运行时错误的C程序,注意程序想通过传地址方式在一个函数中为字符变量C赋一个字符,但它引用了一个空指针,这将引发运行时的段非法错误使得程序异常终止。但我们可以通过gdb跟踪到它产生错误的位置,从而分析出产生错误的原因。n* debugmy.c |*n#in elude Void myputc(char * cptr) | *cptr = a; jprin tf(m ypu tc=%c n,*c ptr);I Iint main(void)|char c; | char * cptr门 c = A; I mypu tc(

13、c ptr); return 0; I使用带-g选项的gcc编译、执行:$gcc -g debugmy.c -o debugmy I$ ./debugmy |段错误 1$使用gdb跟踪查错$ gdb ./debugmyGNU gdb Red Hat Linux (6.3.0.0-1.122rh)Cop yright 2004 Free Software Foun dati on, Inc.GDB is free software, covered by the GNU Gen eral P ublic Lice nse, and you are welcome to cha nge it an

14、 d/or distribute copies of it un der certa in con diti ons.Type show copyin g to see the con diti ons.There is absolutely no warra nty for GDB.Type show warra nty for details.This GDB wascon figuredas i386-redhat-l inu x-g nu .Us inghost libthread_db library/lib/libthread db.so.1.(gdb)现在进入了 gdb调试状态,

15、可以使用gdb的调试 子 命令跟踪程序的执行。Gdb常用命令:list 行号列出指定行号的上下行 break 源程序文件名:行号run(缺省为10行)建立一个断点n ext ste p con ti nue启动被调试的程序从断点处向下执行一行 从断点处向下执行一行,继续从断点处连续执行当前行为函数则跟踪进入函数print变量名打印变量当前值quit 退出 gdb让我们现使用list命令查看一下要调试的程序是否已经装入,输入:(gdb)list 10 |void mypu tc(char * cptr)8910*cptr = a;prin tf(my putc=%cn,*cptr);111213

16、14我们将断点设在第int mai n(void)char c; char * cptr; c = A;15行上,输入:(gdb) break 15 |Break point 1 at 0x80483c0: file debugmy.c, li ne 15.开始跟踪执行,输入:(gdb) runStarting p rogram: /root/ip c/debugmyRead ing symbols from shared object read from target memory.do ne.Loaded system supplied DSO at OxffffeOOOBreak point 1, main () at debugmy.c:1515mypu tc(c ptr);程序执行到第15行上停止,我们采用单步执行跟踪错误的发生,输入:(gdb) ste pmyp utc (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

提交评论