UNIX下的C语言开发环境.ppt

上传人:sh****n 文档编号:6436259 上传时间:2020-02-25 格式:PPT 页数:33 大小:1.09MB
返回 下载 相关 举报
UNIX下的C语言开发环境.ppt_第1页
第1页 / 共33页
UNIX下的C语言开发环境.ppt_第2页
第2页 / 共33页
UNIX下的C语言开发环境.ppt_第3页
第3页 / 共33页
点击查看更多>>
资源描述
第四章UNIX下的C语言开发环境 6 1程序设计环境 学习程序设计从程序语言开始 但还应了解程序执行和程序与外界的交互问题 1 理想态的程序运行环境 用户程序直接控制和使用各种设备 完成各种操作 针对一个简单程序 main intc while c getchar EOF putchar c 认为执行过程为 在单用户单任务环境中基本符合 2 多任务环境下程序执行 多任务中每一时刻都会有多个用户程序提出访问请求 因此会有 如此混乱的情况 程序将无法运行 为使多道环境中的程序正确执行 需要OS管理 用户程序需要系统核心区程序的管理 达到各自任务的执行 6 2基于系统支持的程序设计 1 建立系统编程的思想 理解多道环境程序执行状况 转换用户程序是执行主体的认识 了解OS可提供的服务及服务方式 充分利用OS提供服务功能解决实际问题 尽量使编写的程序最大限度的满足系统平台的支持能力 1 gcc与gdb 1 1UNIX和C语言C是一种在UNIX操作系统的早期就被广泛使用的通用编程语言 它最早是由贝尔实验室的DennisRitchie为了UNIX的辅助开发而写的 C是所有版本的UNIX上的系统语言 几乎任何一种计算机上都有至少一种能用的C编译器 并且它的语法和函数库在不同的平台上都是统一的 80年代末期美国国家标准协会 AmericanNationalStandardsInstitute 发布了一个被称为ANSIC的C语言标准 这保证了在不同平台上的C的一致性 7 1 gcc与gdb 1 2GNUC编译器GNUC编译器 gcc 是一个全功能的ANSIC兼容编译器 它是所有UNIX系统可用的C编译器 gcc是可以在多种硬体平台上编译出可执行程序的超级编译器 其执行效率与一般的编译器相比平均效率要高20 30 8 3 1LINUX下C语言编程概述 1 gcc与gdb gcc编译过程 预处理 对源代码文件中的文件包含 include 预编译语句 如宏定义define等 进行分析 编译 就是把C C 代码 翻译 成汇编代码 汇编 将第二步输出的汇编代码翻译成符合一定格式的机器代码 生成以 o为后缀的目标文件 链接 将上步生成的目标文件和系统库的目标文件和库文件链接起来 最终生成了可以在特定平台运行的可执行文件 10 1 Gcc编译流程解析如本章开头提到的 Gcc的编译流程分为了4个步骤 分别为 预处理 Pre Processing 编译 Compiling 汇编 Assembling 链接 Linking 下面就具体来查看一下Gcc是如何完成4个步骤的 首先 有以下hello c源代码 includeintmain printf Hello Thisisourembeddedworld n return0 3 3Gcc编译器 1 预处理阶段在该阶段 编译器将上述代码中的stdio h编译进来 并且用户可以使用Gcc的选项 E 进行查看 该选项的作用是让Gcc在预处理结束后停止编译过程 root localhostGcc Gcc Ehello c ohello i在此处 选项 o 是指目标文件 由上表可知 i 文件为已经过预处理的C原始程序 以下列出了hello i文件的部分内容 typedefint gconv trans fct struct gconv step struct gconv step data void constunsignedchar constunsignedchar constunsignedchar unsignedchar size t 2 hello c 2intmain printf Hello Thisisourembeddedworld n return0 由此可见 Gcc确实进行了预处理 它把 stdio h 的内容插入到hello i文件中 2 编译阶段接下来进行的是编译阶段 在这个阶段中 Gcc首先要检查代码的规范性 是否有语法错误等 以确定代码的实际要做的工作 在检查无误后 Gcc把代码翻译成汇编语言 用户可以使用 S 选项来进行查看 该选项只进行编译而不进行汇编 生成汇编代码 root localhostGcc Gcc Shello i ohello s以下列出了hello s的内容 可见Gcc已经将其转化为汇编了 感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的 file hello c section rodata align4 LC0 string Hello Thisisourembeddedworld text globlmain typemain functionmain pushl ebpmovl esp ebpsubl 8 espandl 16 espmovl 0 eaxaddl 15 eax section note GNU stack progbits 3 汇编阶段汇编阶段是把编译阶段生成的 s 文件转成目标文件 读者在此可使用选项 c 就可看到汇编代码已转化为 o 的二进制目标代码了 如下所示 root localhostGcc Gcc chello s ohello o Gcc编译器 4 链接阶段在成功编译之后 就进入了链接阶段 在这里涉及到一个重要的概念 函数库 读者可以重新查看这个小程序 在这个程序中并没有定义 printf 的函数实现 且在预编译中包含进的 stdio h 中也只有该函数的声明 而没有定义函数的实现 那么 是在哪里实现 printf 函数的呢 最后的答案是 系统把这些函数实现都被做到名为libc so 6的库文件中去了 在没有特别指定时 Gcc会到系统默认的搜索路径 usr lib 下进行查找 也就是链接到libc so 6库函数中去 这样就能实现函数 printf 了 而这也就是链接的作用 函数库一般分为静态库和动态库两种 静态库是指编译链接时 把库文件的代码全部加入到可执行文件中 因此生成的文件比较大 但在运行时也就不再需要库文件了 其后缀名一般为 a 动态库与之相反 在编译链接时并没有把库文件的代码加入到可执行文件中 而是在程序执行时由运行时链接文件加载库 这样可以节省系统的开销 动态库一般后缀名为 so 如前面所述的libc so 6就是动态库 Gcc在编译时默认使用动态库 完成了链接之后 Gcc就可以生成可执行文件 如下所示 root localhostGcc Gcchello o ohello运行该可执行文件 出现正确的结果如下 root localhostGcc helloHello Thisisourembeddedworld Gcc编译选项 Gcc编译器 1 UNIX下的C语言开发环境 gcc遵循的文件类型规定 c为后缀的文件 C语言源代码文件 a为后缀的文件 是由目标文件构成的档案库文件 C cc或 cxx为后缀的文件 是C 源代码文件 h为后缀的文件 是程序所包含的头文件 i为后缀的文件 是已经预处理过的C源代码文件 ii为后缀的文件 是已经预处理过的C 源代码文件 m为后缀的文件 是Objective C源代码文件 o为后缀的文件 是编译后的目标文件 s为后缀的文件 是汇编语言源代码文件 S为后缀的文件 是经过预编译的汇编语言源代码文件 18 头文件 头文件是用来提供常量的定义和系统和函数调用的声明 这些头文件通常放在 usr include和其子目录中 根据不同的Linux版本 头文件可能放在 usr include sys和 usr include linux include 库函数 库函数是一些预先编译好的函数的集合 这些函数可以有很好的重用性 通常来讲 它们包含有相关的函数集合来完成一项常用任务 典型的库函数有屏幕处理函数 curses和ncurses库 和数据库访问函数 dbm库 标准系统函数通常存放在 lib和 usr lib中 C编译器需要被告知搜索哪个库 否则缺省情况下只搜索标准库 传统静态库 aExamplesare usr lib libc aand usr X11 lib libX11 aforthestandardClibraryandtheX11library共享库 soOnatypicalLinuxsystem thesharedversionofthestandardmathlibraryis usr lib libm so 1 gcc与gdb 1 5gdb调试和分析选项gdb基本命令file装入想要调试的可执行文件 kill终止正在调试的程序 list列出产生执行文件的源代码的一部分 next执行一行源代码但不进入函数内部 step执行一行源代码而且进入函数内部 run执行当前被调试的程序 quit终止gdb watch使你能监视一个变量的值而不管它何时被改变 break在代码里设置断点 这将使程序执行到这里时被挂起 make使你能不退出gdb就可以重新产生可执行文件 shell使你能不离开gdb就执行UNIXshell命令 21 1 gcc与gdb gdb调试举例 gdbtest c includeintsum intm intmain intargc char argv inti n 0 sum 50 for i 1 i 50 i n i printf Thesumof1 50is d n n intsum intm inti n 0 for i 1 i m i n i printf Thesumof1 dis d n m n 例 gcc Wall ggdbtest c ogdbtest 22 1 gcc与gdb 1 启动gdb开始调试 例1 gdbgdbtest 例2 gdb gdb filegdbtest 23 1 gcc与gdb 2 在gdb中查看源代码 例 gdb list list也可以缩写为l 24 1 gcc与gdb 3 在gdb中设置断点 例1 gdb break9 break也可以缩写为b 注意 在gdb中利用行号设置断点 是指代码运行到对应行号之前暂停 gdb中可以设置多个断点 25 1 gcc与gdb 3 在gdb中设置断点 例2 gdb breaksum 设置函数断点 在函数体开始处 例3 gdb break10ifi 10 设置条件断点 26 1 gcc与gdb 4 开看断点情况 例 gdb infobreak 27 1 gcc与gdb 5 运行代码 例 gdb run run也可以缩写为r 28 1 gcc与gdb 6 查看变量 例 gdb printi print也可以缩写为p i为变量名 N 是当前变量值的引用标记 29 1 gcc与gdb 7 单步运行 单步运行可以使用命令 step 和 next 它们之间的区别在于 若有函数调用的时候 step 会进入函数体 而 next 不会进入该函数 8 恢复程序运行 使用命令 continue 可以恢复程序正常运行 直到遇到下一个断点或者到程序结束 gdb中程序有 运行 暂停 和 停止 三种状态 暂停 状态时 函数的地址 参数 局部变量都被压入 栈 中 故可以查看函数的各种属性 函数处于 停止 状态时 栈 会自动撤销 也就无法查看函数的信息了 30 2 make工程管理器 2 1为什么要使用make 工作量问题 对于拥有多个 上百个 源文件的软件项目 只需编写一次编译过程 而不需要在每次源文件修改后重复输入众多的文件名和编译命令进行编译 效率问题 make能够根据文件的时间戳自动发现更新过的源文件 并通过读入Makefile文件来对更新的源文件进行编译而对其它文件只进行链接操作 31 2 make命令 2 2Makefile的格式Makefile是make读入的唯一配置文件 Makefile文件通常包含如下内容 需要由make创建的目标体 target 通常是目标文件或可执行文件 要创建的目标体所依赖的文件 dependency file 创建每个目标体时需要运行的命令 commmand Makefile格式 target dependency filecommand command之前必须有个 tab 32 4 链接特殊函数库 filenameistemp c includeintmain intargc char argv doublevalue value log argc printf Value f n value 用命令 gcc otemptemp c编译时出错 修改命令 gcc otemptemp c lm这里指明编译时与数学库libm a相链接 则可正确编译 假设有程序temp c如下
展开阅读全文
相关资源
相关搜索

当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!