第五章UNIX下的C语言开发环境.ppt
《第五章UNIX下的C语言开发环境.ppt》由会员分享,可在线阅读,更多相关《第五章UNIX下的C语言开发环境.ppt(33页珍藏版)》请在三一办公上搜索。
1、第四章 UNIX下的C语言开发环境,6.1 程序设计环境,学习程序设计从程序语言开始,但还应了解程序执行和程序与外界的交互问题。,1.理想态的程序运行环境,用户程序直接控制和使用各种设备,完成各种操作。,针对一个简单程序:,main()int c;while(c=getchar()!=EOF)putchar(c);,认为执行过程为:,在单用户单任务环境中基本符合。,2.多任务环境下程序执行,多任务中每一时刻都会有多个用户程序提出访问请求,因此会有:,如此混乱的情况,程序将无法运行。,为使多道环境中的程序正确执行,需要OS管理。,用户程序需要系统核心区程序的管理,达到各自任务的执行。,6.2 基
2、于系统支持的程序设计,1.建立系统编程的思想,理解多道环境程序执行状况,转换用户程序是执行主体的认识。了解OS可提供的服务及服务方式。充分利用OS提供服务功能解决实际问题。尽量使编写的程序最大限度的满足系统平台的支持能力。,1.gcc 与 gdb,1.1 UNIX和C语言C是一种在UNIX操作系统的早期就被广泛使用的通用编程语言,它最早是由贝尔实验室的DennisRitchie为了UNIX的辅助开发而写的。C是所有版本的UNIX上的系统语言。几乎任何一种计算机上都有至少一种能用的C编译器;并且它的语法和函数库在不同的平台上都是统一的。80年代末期美国国家标准协会(AmericanNationa
3、lStandardsInstitute)发布了一个被称为ANSIC的C语言标准,这保证了在不同平台上的C的一致性。,7,1.gcc 与 gdb,1.2 GNU C编译器GNUC编译器(gcc)是一个全功能的ANSIC兼容编译器,它是所有UNIX系统可用的C编译器。gcc是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%30%。,8,3.1 LINUX下C语言编程概述,1.gcc 与 gdb,gcc编译过程:预处理,对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。编译,就是把C/C+代码“翻译”成汇编代码。
4、汇编,将第二步输出的汇编代码翻译成符合一定格式的机器代码,生成以.o为后缀的目标文件。链接,将上步生成的目标文件和系统库的目标文件和库文件链接起来,最终生成了可以在特定平台运行的可执行文件。,10,1.Gcc编译流程解析如本章开头提到的,Gcc的编译流程分为了4个步骤,分别为:预处理(Pre-Processing);编译(Compiling);汇编(Assembling);链接(Linking)。下面就具体来查看一下Gcc是如何完成4 个步骤的。首先,有以下hello.c源代码:#includeint main()printf(Hello!This is our embedded world!
5、n);return 0;,3.3 Gcc编译器,(1)预处理阶段在该阶段,编译器将上述代码中的stdio.h编译进来,并且用户可以使用Gcc的选项“-E”进行查看,该选项的作用是让Gcc在预处理结束后停止编译过程。rootlocalhost Gcc#Gcc E hello.c o hello.i在此处,选项“-o”是指目标文件,由上表可知,“.i”文件为已经过预处理的C 原始程序。以下列出了hello.i文件的部分内容:typedef int(*_gconv_trans_fct)(struct _gconv_step*,struct _gconv_step_data*,void*,_const
6、 unsigned char*,_const unsigned char*,_const unsigned char*,unsigned char*,size_t*);,#2 hello.c 2int main()printf(Hello!This is our embedded world!n);return 0;由此可见,Gcc确实进行了预处理,它把“stdio.h”的内容插入到hello.i文件中。,(2)编译阶段接下来进行的是编译阶段,在这个阶段中,Gcc 首先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把代码翻译成汇编语言。用户可以使用“-
7、S”选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。rootlocalhost Gcc#Gcc S hello.i o hello.s以下列出了hello.s的内容,可见Gcc已经将其转化为汇编了,感兴趣的读者可以分析一下这一行简单的C语言小程序是如何用汇编代码实现的。.file hello.c“.section.rodata.align 4.LC0:.string Hello!This is our embedded world!.text.globl main.type main,functionmain:pushl%ebpmovl%esp,%ebpsubl$8,%espand
8、l$-16,%espmovl$0,%eaxaddl$15,%eax.section.note.GNU-stack,progbits,(3)汇编阶段汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读者在此可使用选项“-c”就可看到汇编代码已转化为“.o”的二进制目标代码了。如下所示:rootlocalhost Gcc#Gcc c hello.s o hello.o,Gcc编译器,(4)链接阶段在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数库。读者可以重新查看这个小程序,在这个程序中并没有定义“printf”的函数实现,且在预编译中包含进的“stdio.h”中也只有该函数的
9、声明,而没有定义函数的实现,那么,是在哪里实现“printf”函数的呢?最后的答案是:系统把这些函数实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,Gcc 会到系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这样就能实现函数“printf”了,而这也就是链接的作用。函数库一般分为静态库和动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 第五 UNIX 语言 开发 环境
链接地址:https://www.31ppt.com/p-5316613.html