Linux程序设计PPT课件_第1页
Linux程序设计PPT课件_第2页
Linux程序设计PPT课件_第3页
Linux程序设计PPT课件_第4页
Linux程序设计PPT课件_第5页
已阅读5页,还剩45页未读 继续免费阅读

下载本文档

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

文档简介

1 Linux下的C C 程序设计 2 Linux下的C C 程序设计介绍gcc编译系统gdb程序调试工具 3 1 Linux下的C C 程序设计介绍 Linux是一个开放源代码的操作系统 其稳定性与低廉的价格使其在服务器 嵌入式领域以及桌面应用中逐渐占有越来越大的市场份额 因此 对Linux环境下的程序开发人员的需求也就越来越大了 C语言是Linux操作系统中的核心语言 掌握Linux环境下的C语言开发是至关重要的 4 Linux下的C C 程序设计介绍 Linux编程实现步骤 vihello c按下I进入编辑状态输入以下内容 includemain printf Itrytouselinux n 5 Linux下的C C 程序设计介绍 Linux编程实现步骤 按ESC进入命令状态输入 wq 保存文件并退出 gcc ohello outhello c编译hello c 将并将文件输出到hello out hello out你将会看到输出结果 Itrytouselinux 6 2 gcc编译系统 GNUCompilerCollection RichardStallman since1987一套多语言 多平台的编译器 链接器软件集合Version4 0支持Ada GCCforAdaakaGNAT C C GCCforC akaG Fortran GCCforFortranakaGFortran Java GCCforJavaakaGCJ Objective C主要支持平台 Alpha ARM Blackfin System 390 x86andAMD64 IA 64i e the Itanium Motorola68000 MIPS PowerPC SPARCWindows下的GCC环境dev c MinGW MinimalistGNUonWindows 7 2 gcc编译系统 续 目前Linux平台上最常用的C语言编译系统是gcc GNUCompilerCollection 常用文件名后缀及其表示的文件类型 8 2 gcc编译系统 续 gcc命令的工作过程 9 1 预处理阶段预处理程序 Preprocessor 读取C语言源文件 对其中以 开头的指令 伪指令 和特殊符号进行处理 伪指令主要包括文件包含 宏定义和条件编译指令 2 编译阶段编译程序 Compiler 对预处理之后的输出文件进行词法分析和语法分析 试图找出所有不符合语法规则的部分 在确定各成分都符合语法规则后 将其 翻译 为功能等价的中间代码表示或者汇编代码 3 汇编过程汇编程序 Assembler 把汇编语言代码翻译成目标机器代码的过程 4 连接阶段将一个文件中引用的符号 如变量或函数调用 与该符号在另外一个文件中的定义连接起来 从而使有关的目标文件连成一个整体 最终成为可被操作系统执行的可执行文件 连接模式分为静态连接和动态连接 10 2 gcc编译系统 续 gcc指令的一般格式为 gcc 参数 要编译的文件 参数 目标文件 gccf1 cf2 c 针对C语言源程序 执行完成后 生成默认的可执行文件a out 按照选项作用所对应的编译阶段 可将gcc的选项分为四组 预处理选项 编译选项 优化选项和连接选项 1 预处理选项 11 2 编译程序选项 2 gcc编译系统 续 12 3 优化程序选项优化分为对中间代码的优化和针对目标码生成的优化 4 连接程序选项 13 2 gcc编译系统 续 应用举例 示例源程序 hello c includeintmain void printf hellogcc r n return0 14 生成预处理文件命令 gcc Ehello c ohello i 预处理文件hello i的部分内容 externvoidfunlockfile FILE stream 679 usr include stdio h 3 2 hello c 2intmain void printf hellogcc n return0 2 gcc编译系统 续 15 2 gcc编译系统 续 生成汇编文件 gcc Shello c ohello s 汇编文件hello s的部分内容 main pushl ebpmovl esp ebp addl 16 espmovl 0 eaxleaveret 16 2 gcc编译系统 续 生成目标文件命令 gcc chello c ohello o生成可执行文件命令 gcchello c ohello运行程序 hellohellogcc 17 2 gcc编译系统 续 gcc错误类型及对策C语法错误 C语言的语法错误头文件错误 找不到头文件head h连接库错误 找不到所需要的函数库未定义符号 有未定义的符号 18 2 gcc编译系统 续 gcc调试总结主要为语法错误 输入错误 类型匹配错误 分析信息 主要来自gcc编译时产生的提示信息错误警告定位 不一定在提示信息描述的地方 综合分析提示信息及提示行的上下文环境 定位并修正错误 警告 有的警告可以不用修复 19 Makefile的编写 对于大型程序 通常由成千上万个模块 子程序 组成 在编写过程中 人们希望对其中某个 些 模块的修改不要导致对整个程序的编译 这也是Makefile的一个主要功用之一 Make工具最主要也是最基本的功能就是通过makefile文件来描述源程序之间的相互关系并自动维护编译工作 makefile文件需要按照某种语法进行编写 文件中需要说明如何编译各个源文件并连接生成可执行文件 并要求定义源文件之间的依赖关系 makefile文件是许多编译器 包括WindowsNT下的编译器 维护编译信息的常用方法 只是在集成开发环境中 用户通过友好的界面修改makefile文件而已 20 Makefile的编写 Makefile中一般包含如下内容 需要由make工具创建的项目 通常是目标文件和可执行文件 要创建的项目依赖哪些文件 创建每个项目时需要运行的命令 21 Makefile举例 Makefile内容factorial main ofactorial ogcc ofactorialmain ofactorial omain o main cgcc cmain cfactorial o factorial cgcc cfactorial c Makefile简化写法factorial main ofactorial ogcc o main o main cgcc c factorial o factorial cgcc c gcc rm cp等命令前是tab分割符 不能用空格 否则会出现 makefile 2 遗漏分隔符 停止 类似的错误 22 Makefile举例 function1 h function2 h main c function1 c function2 c function1 o main o function2 o main 头文件 源文件 目标文件 可执行文件 连接 编译 23 Makefile举例 Makefile内容main main ofunction1 ofunction2 ogcc omainmain ofunction1 ofunction2 omain o main cfunction1 hfunction2 hgcc cmain cfunction1 o function1 cfunction1 hgcc cfunction1 cfunction2 o function2 cfunction2 hgcc cfunction2 cclean rm f o 24 Makefile举例 通过使用makefile的变量和隐含规则 可简化为如下形式 objects main ofunction1 ofunction2 omain objects gcc omain objects main o function1 hfunction2 hfunction1 o function1 hfunction2 o function2 hclean rm f o跟我一起写Makefile 25 静态调试 在程序编译阶段查错并修正错误 主要为语法错误 输入错误 类型匹配错误 排错方式 利用错误 警告信息 并结合源文件环境排错动态调试 在程序运行阶段查错并修正错误 主要错误类型 算法错误 输入错误 排错方式 利用调试工具定位并修正错误 3 gdb程序调试工具 续 26 3 gdb程序调试工具 程序中的错误按其性质可分为三种 1 编译错误 即语法错误 主要是程序代码中有不符合所用编程语言语法规则的错误 2 运行错误 如对负数开平方 除数为0 循环终止条件永远不能达到等 3 逻辑错误 这类错误往往是编程前对求解的问题理解不正确或算法不正确引起的 它们很难查找 查找程序中的错误 诊断其准确位置 并予以改正 这就是程序调试 程序调试分为人工查错与机器调试 gdb主要帮助用户在调试程序时完成四方面的工作 1 启动程序 可以按用户要求影响程序的运行行为 2 使运行程序在指定条件处停止 3 当程序停止时 检查它出现了什么问题 4 动态改变程序的执行环境 这样就可以纠正一个错误的影响 然后再纠正其他错误 27 3 gdb程序调试工具 gdb概述Linux下的gdb调试器 是一款GNU组织开发并发布的UNIX Linux下的程序调试工具 它没有图形化的友好界面 但功能强大 在进行应用程序的调试之前 要注意的是gdb进行调试的是可执行文件 而不是如 c 这样的源代码文件 因此 需要先通过gcc编译生成可执行文件才能用gdb进行调试 28 3 gdb程序调试工具 续 完成如下的调试任务 1 设置断点 2 监视程序变量的值 3 程序的单步执行 4 修改变量的值 29 3 gdb程序调试工具 续 为了发挥gdb的全部功能 需要在编译源程序时使用 g选项 gcc gprog c oprog 针对C语言源程序prog c gcc gprogram cpp oprogram 针对C 源程序program cpp 启动gdb的常用方法有 1 以一个可执行程序作为gdb的参数 gdbprgm 2 同时以可执行程序和core文件作为gdb的参数 gdbprgmcore启动gdb后就显示其提示符 gdb 并等待用户输入相应的内部命令 用户可以利用命令quit终止其执行 退出gdb环境 30 3 gdb程序调试工具 续 启动gdb 31 3 gdb程序调试工具 续 32 3 gdb程序调试工具 续 控制程序的执行 设置断点编译源程序时需要使用 g选项在gdb中用break命令 其缩写形式为b 设置断点 breaklinenum 在当前文件指定行linenum处设置断点 停在该行开头 breaklinenumifcondition 在当前文件指定行linenum处设置断点 但仅在条件表达式condition成立时才停止程序执行 breakfunction 在当前文件函数function的入口处设置断点 breakfile linenum 在源文件file的linenum行上设置断点 breakfile function 在源文件file的函数function的入口处设置断点 break address 运行程序在指定的内存地址address处停止 break 不带任何参数 则表示在下一条指令处停止 断点应设置在可执行的行上 不应是变量定义之类的语句 33 2 显示断点infobreakpoints num infobreak num 3 删除断点delete bkptnums 4 运行程序run args run简写是r 5 程序的单步跟踪和连续执行 1 单步跟踪step N 参数N表示每步执行的语句行数 进入被调用函数内部执行 next N 参数N表示每步执行的语句行数 被调用函数被当做一条指令执行 stepi 缩写为si 或nexti 缩写为ni 命令一条一条地执行机器指令 2 连续执行利用continue c或fg命令连续执行到下一个断点 3 gdb程序调试工具 续 34 6 函数调用callexpr其中 expr是所用编程语言的函数调用表达式 包括函数名和实参 在调试过程中 可以使用return命令强行从正在执行的函数中退出 return expr 还可以使用finish命令退出函数 但它并不立即退出 而是继续运行 直至当前函数返回 3 gdb程序调试工具 续 35 调试举例 源文件 假定如下greeting h和greeting c存放在functions目录下 36 静态调试举例 分块编译greeting c gcc g Wall cfunctions greeting c g 将调试信息加入到编译的目标文件中 Wall 将编译过程中的所有级别的警告都打印出来 无错误my app c gcc g Wall cmy app c Ifunctions参数含义同上 Idir添加头文件搜索目录错误信息 37 静态调试举例 错误信息 错误记录格式 文件名 行号 错误描述 my app c Infunction main my app c 6 n undeclared firstuseinthisfunction my app c 6 Eachundeclaredidentifierisreportedonlyoncemy app c 6 foreachfunctionitappearsin my app c 9 parseerrorbefore greeting my app c 6 warning unusedvariable name 38 静态调试举例 分析 定位错误 警告 my app c的第6行 描述含义 n是一个没有声明的变量 分析 声明数字name时用到了变量n 但变量n在之前没有声明 改正 声明一个新变量n 或者将n改为宏N这里取第2种改正方法 39 静态调试举例 my app c的第9行 描述含义 在 greeting 之前出现解析错误 分析 c中每行程序以 结束 第9行greeting之前的程序行没有以 结束 改正 第8行末尾增加 重新编译错误信息 my app c Infunction main my app c 11 warning controlreachesendofnon voidfunction 40 静态调试举例 分析 定位错误 警告 警告 my app c的11行描述含义 控制以非空函数结束 分析 main函数返回类型为int 源程序没有以return整数形式结束 改正 将main改为返回void类型 或者 在main程序后增加return返回语句 采用第2种解决方式 重新编译 无错误或警告信息 完成静态调试gcc g omy appmy app cfunctions greeting c 41 静态调试举例 静态调试总结主要为语法错误 输入错误 类型匹配错误 分析信息 主要来自gcc编译时产生的提示信息错误警告定位 不一定在提示信息描述的地方 综合分析提示信息及提示行的上下文环境 定位并修正错误 警告 有的警告可以不用修复 42 动态调试举例 常见的动态调试方法 增加调试语句 记录程序的执行状况 观察内存变化 使用调试工具 GUNDebuger的功能 启动程序 设置程序执行的上下文环境 在指定的条件下停止程序

温馨提示

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

评论

0/150

提交评论