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

下载本文档

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

文档简介

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

2、组合。下表是 GCC运行的平台。硬件表 GCC运行的平台操作系统AlphaHPPAIntel x86MIPSPowerPCSparcRed Hat Linux 7.1HPUX 11.0Debian Linux 2.2, Red Hat Linux 6.2,FreeBSD 4.5IRIX 6.5Solaris 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 hello.c输入字符i,插入文本以下文本/* hello.c*/#include <stdio.h>int main(void)printf(" Hello World!n");return 0;最后输入字符 <Esc>:wq, 返回命令行,键入以下编译命令:$gcc hello.c (-lstdc+)如果没有错误gcc将生成默认的可执

4、行文件a.out,执行 a.out:$./a.outHello World!$gcc 带有多达数页的编译选项,我们仅列出最常用的几项:-o 可执行文件名指定输出的可执行文件名,而不是默认的a.out-c只编译生成 .o的目标文件 , 不连接生成可执行文件-s只编译生成 .s的汇编文件 , 不连接生成可执行文件-g在可执行文件中加入标准调试信息-Wall允许 GCC发出警告型错误信息选项使用的例子 :对以上 hello.c使用 -o,-g常用选项重新编译、执行 :$gcc -g hello.c -o hello$./helloHello World!$GCC默认的扩展文件名:.cC语言源代码.C

5、.cc.i.ii.S .s.o.a.soC+语言源代码预处理后的C 语言源代码预处理后的C+语言源代码汇编语言源代码编译后的目标代码编译后的库代码下面的例子由两个文件组成:main.c, calc.c,其中,main.c文件内容为:#include <stdio.h>int calc(int);int main(int argc, char* argv)int iInput=0, iOutput=0;int i=0;scanf("%i",&iInput);while(iInput < 0)printf("Please input a po

6、sitive integer!n");scanf("%i",&iInput);iOutput = calc(iInput);printf("Result is:%in", iOutput);return 0;calc.c的文件内容为:#include <stdio.h>int calc(int iIn)int i = 0, iOut = 0;iOut = iIn;for(i = 0; i < iIn; i+)iOut += iOut * iIn;return iOut;1、编译过程有三种方式编译这两个源程序,一是直接使

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

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

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

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

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

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

13、一个带有运行时错误的C程序, 注意程序想通过传地址方式在一个函数中为字符变量C 赋一个字符, 但它引用了一个空指针,这将引发运行时的段非法错误使得程序异常终止。但我们可以通过gdb跟踪到它产生错误的位置,从而分析出产生错误的原因。/* debugmy.c*/#include <stdio.h>void myputc(char * cptr)*cptr = 'a'printf("myputc=%cn",*cptr);int main(void)char c;char * cptr;c = 'A'myputc(cptr);return

14、 0;使用带 -g选项的 gcc 编译、执行:$gcc -g debugmy.c -o debugmy$ ./debugmy段错误$使用 gdb跟踪查错$ gdb ./debugmyCopyright 2004 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you arewelcome to change it and/or distribute copies of it under certain conditions.Type "

15、show copying" to see the conditions.There is absolutely no warranty for GDB.Type "show warranty" for details.ThisGDBwasconfiguredas"i386-redhat-linux-gnu".Usinghostlibthread_db library(gdb)现在进入了 gdb 调试状态,可以使用gdb的调试子命令跟踪程序的执行。Gdb 常用命令:list 行号 列出指定行号的上下行(缺省为10行)break 源程序文件名: 行

16、号建立一个断点run启动被调试的程序next从断点处向下执行一行step从断点处向下执行一行,当前行为函数则跟踪进入函数continue继续从断点处连续执行print变量名打印变量当前值quit退出 gdb让我们现使用list命令查看一下要调试的程序是否已经装入,输入:(gdb)list 105 void myputc(char * cptr)6 7*cptr = 'a'8printf("myputc=%cn",*cptr);910 int main(void)11 121314char c;char * cptr;c = 'A'我们将断点设

17、在第15行上,输入:(gdb) break 15Breakpoint 1 at 0x80483c0: file debugmy.c, line 15.开始跟踪执行,输入:(gdb) runStarting program: /root/ipc/debugmyReading symbols from shared object read from target memory.done.Loaded system supplied DSO at 0xffffe000Breakpoint 1, main () at debugmy.c:1515myputc(cptr);程序执行到第15行上停止,我们采用单步执行跟踪错误的发生,输入:(gdb) stepmyputc (cptr=0x9bbe40 "U211? WVS203? L? 215s") at debugmy.c:77*cptr = 'a'程序执行一行,进入函数myputc, 再单步执行一行,再次输入:(gdb) stepProgram received si

温馨提示

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

评论

0/150

提交评论