《Linux程序设计》PPT课件.ppt_第1页
《Linux程序设计》PPT课件.ppt_第2页
《Linux程序设计》PPT课件.ppt_第3页
《Linux程序设计》PPT课件.ppt_第4页
《Linux程序设计》PPT课件.ppt_第5页
已阅读5页,还剩41页未读 继续免费阅读

下载本文档

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

文档简介

Linux下的C/C+程序设计,Linux下的C/C+程序设计介绍 gcc编译系统 gdb程序调试工具 Linux下的窗口程序设计 (QT程序设计),1. Linux下的C/C+程序设计介绍,Linux是一个开放源代码的操作系统,其稳定性与低廉的价格使其在服务器、嵌入式领域以及桌面应用中逐渐占有越来越大的市场份额。因此,对Linux环境下的程序开发人员的需求也就越来越大了。 C语言是Linux操作系统中的核心语言,掌握Linux环境下的C语言开发是至关重要的。,Linux下的C/C+程序设计介绍,Linux编程实现步骤: $ vi hello.c 按下I进入编辑状态 输入以下内容 #include main() printf(“I try to use linux! n”); echo “echo also can be used for output。n” ,Linux下的C/C+程序设计介绍,Linux编程实现步骤: 按ESC进入命令状态 输入:“:wq” 保存文件并退出 $ gcc -o hello.out hello.c 编译hello.c ,将并将文件输出到hello.out $ ./hello.out 你将会看到输出结果 I try to use linux! echo also can be used for output。 $,2. gcc编译系统,GNU Compiler Collection, Richard Stallman, since 1987 一套多语言,多平台的编译器/链接器软件集合 Version 4.0支持Ada (GCC for Ada aka GNAT), C, C+ (GCC for C+ aka G+), Fortran (GCC for Fortran aka GFortran), Java (GCC for Java aka GCJ), Objective-C 主要支持平台:Alpha, ARM, Blackfin, System/390, x86 and AMD64, IA-64 i.e. the “Itanium“, Motorola 68000, MIPS, PowerPC, SPARC Windows下的GCC环境 dev-c+, using MinGW,2. gcc编译系统(续),目前Linux平台上最常用的C语言编译系统是gcc(GNU Compiler Collection) 常用文件名后缀及其表示的文件类型,2. gcc编译系统(续),gcc命令的工作过程,1预处理阶段 预处理程序(Preprocessor)读取C语言源文件,对其中以“#”开头的指令(伪指令)和特殊符号进行处理。 伪指令主要包括文件包含、宏定义和条件编译指令。 2编译阶段 编译程序(Compiler)对预处理之后的输出文件进行词法分析和语法分析,试图找出所有不符合语法规则的部分。在确定各成分都符合语法规则后,将其“翻译”为功能等价的中间代码表示或者汇编代码。 3汇编过程 汇编程序(Assembler)把汇编语言代码翻译成目标机器代码的过程。 4连接阶段 将一个文件中引用的符号(如变量或函数调用)与该符号在另外一个文件中的定义连接起来,从而使有关的目标文件连成一个整体,最终成为可被操作系统执行的可执行文件。 连接模式分为静态连接和动态连接。,2. gcc编译系统(续),gcc指令的一般格式为: gcc 参数 要编译的文件 参数 目标文件 $ gcc f1.c f2.c (针对C语言源程序)执行完成后,生成默认的可执行文件a.out。 按照选项作用所对应的编译阶段,可将gcc的选项分为四组:预处理选项、编译选项、优化选项和连接选项。 1预处理选项,2编译程序选项,2. gcc编译系统(续),3优化程序选项 优化分为对中间代码的优化和针对目标码生成的优化。 4连接程序选项,2. gcc编译系统(续),应用举例,示例源程序hello.c #include int main(void) printf(“hello gcc!rn“); return 0; ,生成预处理文件命令 $gcc E hello.c o hello.i,预处理文件hello.i的部分内容 extern void funlockfile (FILE *_stream) ; # 679 “/usr/include/stdio.h“ 3 # 2 “hello.c“ 2 int main(void) printf(“hello gcc!n“); return 0; ,2. gcc编译系统(续),2. gcc编译系统(续),生成汇编文件 $gcc S hello.c o hello.s,汇编文件hello.s的部分内容 main: pushl %ebp movl %esp, %ebp addl $16, %esp movl $0, %eax leave ret “,2. gcc编译系统(续),生成目标文件 命令: $gcc c hello.c o hello.o 生成可执行文件 命令: $gcc hello.c o hello 运行程序 $./hello hello gcc!,2. gcc编译系统(续),gcc错误类型及对策 C语法错误:C语言的语法错误 头文件错误:找不到头文件head.h 连接库错误:找不到所需要的函数库 未定义符号:有未定义的符号,2. gcc编译系统(续),gcc调试总结 主要为语法错误: 输入错误; 类型匹配错误; 分析信息: 主要来自gcc编译时产生的提示信息 错误警告定位: 不一定在提示信息描述的地方; 综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。 有的警告可以不用修复;,Makefile的编写,对于大型程序,通常由成千上万个模块(子程序)组成,在编写过程中,人们希望对其中某个(些)模块的修改不要导致对整个程序的编译,这也是Makefile的一个主要功用之一。,Makefile举例,Makefile内容 factorial:main.o factorial.o gcc o factorial main.o factorial.o main.o:main.c gcc c main.c factorial.o:factorial.c gcc c factorial.c,Makefile简化写法 factorial:main.o factorial.o gcc o $ $ main.o:main.c gcc c $ factorial.o:factorial.c gcc c $,静态调试: 在程序编译阶段查错并修正错误; 主要为语法错误: 输入错误; 类型匹配错误; 排错方式: 利用错误、警告信息,并结合源文件环境排错 动态调试: 在程序运行阶段差错并修正错误; 主要错误类型: 算法错误; 输入错误; 排错方式: 利用调试工具定位并修正错误;,3. gdb程序调试工具(续),3. gdb程序调试工具,程序中的错误按其性质可分为三种: (1)编译错误,即语法错误。主要是程序代码中有不符合所用编程语言语法规则的错误。 (2)运行错误。如对负数开平方,除数为0,循环终止条件永远不能达到等 。 (3)逻辑错误。这类错误往往是编程前对求解的问题理解不正确或算法不正确引起的,它们很难查找。 查找程序中的错误,诊断其准确位置,并予以改正,这就是程序调试。程序调试分为人工查错与机器调试。 gdb主要帮助用户在调试程序时完成四方面的工作: (1)启动程序,可以按用户要求影响程序的运行行为。 (2)使运行程序在指定条件处停止。 (3)当程序停止时,检查它出现了什么问题。 (4)动态改变程序的执行环境,这样就可以纠正一个错误的影响,然后再纠正其他错误。,3. gdb程序调试工具,gdb概述 Linux下的gdb调试器,是一款GNU组织开发并发布的UNIX/Linux下的程序调试工具。它没有图形化的友好界面,但功能强大。 在进行应用程序的调试之前,要注意的是gdb进行调试的是可执行文件,而不是如“.c”这样的源代码文件。因此,需要先通过gcc编译生成可执行文件才能用gdb进行调试。,3. gdb程序调试工具(续),完成如下的调试任务: (1)设置断点。 (2)监视程序变量的值。 (3)程序的单步执行。 (4)修改变量的值。,3. gdb程序调试工具(续),为了发挥gdb的全部功能,需要在编译源程序时使用-g选项: $ gcc -g prog.c -o prog (针对C语言源程序prog.c) $ gcc -g program.cpp -o program (针对C+源程序program.cpp) 启动gdb的常用方法有: (1)以一个可执行程序作为gdb的参数: $ gdb prgm (2)同时以可执行程序和core文件作为gdb的参数: $ gdb prgm core 启动gdb后就显示其提示符:(gdb),并等待用户输入相应的内部命令。 用户可以利用命令quit终止其执行,退出gdb环境。,3. gdb程序调试工具(续),启动gdb,3. gdb程序调试工具(续),3. gdb程序调试工具(续),控制程序的执行-设置断点 编译源程序时需要使用-g选项 在gdb中用break命令(其缩写形式为b)设置断点: break linenum (在当前文件指定行linenum处设置断点,停在该行开头) break linenum if condition (在当前文件指定行linenum处设置断点,但仅在条件表达式condition成立时才停止程序执行) break function (在当前文件函数function的入口处设置断点) break file:linenum (在源文件file的linenum行上设置断点) break file:function (在源文件file的函数function的入口处设置断点) break *address (运行程序在指定的内存地址address处停止) break (不带任何参数,则表示在下一条指令处停止) 断点应设置在可执行的行上,不应是变量定义之类的语句。,2. 显示断点 info breakpoints num info break 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程序调试工具(续),6函数调用 call expr 其中,expr是所用编程语言的函数调用表达式,包括函数名和实参。 在调试过程中,可以使用return命令强行从正在执行的函数中退出: return expr 还可以使用finish命令退出函数,但它并不立即退出,而是继续运行,直至当前函数返回。,3. gdb程序调试工具(续),调试举例,源文件,静态调试举例,分块编译 greeting.c $gcc -g -Wall -c functions/greeting.c -g:将调试信息加入到编译的目标文件中 ; -Wall:将编译过程中的所有级别的警告都打印出来 ; 无错误 my_app.c $gcc -g -Wall -c my_app.c -Ifunctions 参数含义同上 错误信息:,静态调试举例,错误信息: 错误记录格式: 文件名:行好:错误描述,my_app.c: In function main: my_app.c:6: n undeclared (first use in this function) my_app.c:6: (Each undeclared identifier is reported only once my_app.c:6: for each function it appears in.) my_app.c:9: parse error before “greeting“ my_app.c:6: warning: unused variable name,静态调试举例,分析、定位错误(警告): my_app.c的第6行: 描述含义: n是一个没有声明的变量; 分析: 声明数字name时用到了变量n,但变量n在之前没有声明; 改正: 声明一个新变量n; 或者 将n改为宏N 这里取第2种改正方法;,静态调试举例,my_app.c的第9行: 描述含义: 在“greeting”之前出现解析错误; 分析: c中每行程序以;结束,第9行greeting之前的程序行没有以;结束; 改正: 第8行末尾增加“;” 重新编译 错误信息:,my_app.c: In function main: my_app.c:11: warning: control reaches end of non-void function,静态调试举例,分析、定位错误(警告): 警告:my_app.c的11行 描述含义: 控制以非空函数结束; 分析: main函数返回类型为int,源程序没有以return 整数 形式结束; 改正: 将main改为返回void类型; 或者: 在main程序后增加return 返回语句; 采用第2种解决方式; 重新编译,无错误或警告信息,完成静态调试,静态调试举例,静态调试总结 主要为语法错误: 输入错误; 类型匹配错误; 分析信息: 主要来自gcc编译时产生的提示信息 错误警告定位: 不一定在提示信息描述的地方; 综合分析提示信息及提示行的上下文环境,定位并修正错误、警告。 有的警告可以不用修复;,动态调试举例,常见的动态调试方法: 增加调试语句 ; 记录程序的执行状况 ; 观察内存变化 ; 使用调试工具; GUN Debuger的功能: 启动程序,设置程序执行的上下文环境; 在指定的条件下停止程序; 程序停止时,检查程序的状态; 在程序运行时,改变程序状态,使其按照改变后的状态继续执行。,动态调试举例,对静态调试中的例子继续进行动态调试 工具:gdb 启动gdb,动态调试举例,调

温馨提示

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

评论

0/150

提交评论