UNIX下的C语言开发环境

上传人:平*** 文档编号:47546942 上传时间:2018-07-02 格式:PPT 页数:33 大小:1.09MB
返回 下载 相关 举报
UNIX下的C语言开发环境_第1页
第1页 / 共33页
UNIX下的C语言开发环境_第2页
第2页 / 共33页
UNIX下的C语言开发环境_第3页
第3页 / 共33页
UNIX下的C语言开发环境_第4页
第4页 / 共33页
UNIX下的C语言开发环境_第5页
第5页 / 共33页
点击查看更多>>
资源描述

《UNIX下的C语言开发环境》由会员分享,可在线阅读,更多相关《UNIX下的C语言开发环境(33页珍藏版)》请在金锄头文库上搜索。

1、Unix Programming第四章 UNIX下的C语言开发环境Unix Programming6.1 程序设计环境学习程序设计从程序语言开始,但还应了 解程序执行和程序与外界的交互问题。1.理想态的程序运行环境用户程序直接控 制和使用各种设 备,完成各种操 作。Unix Programming针对一个简单程序: main() int c; while ( ( c=getchar() != EOF ) putchar(c); 认为执行 过程为:在单用户单任务环境中基本符合。Unix Programming2. 多任务环境下程序执行多任务中每一时刻都会有多个用户程序提出 访问请求,因此会有:如

2、此混乱的情况,程序将无法运行。Unix Programming为使多道环境中的程序正确执行,需要OS管理。用户程序需要系统核心区程序的管理,达到各自任务 的执行。Unix Programming6.2 基于系统支持的程序设计1. 建立系统编程的思想 理解多道环境程序执行状况,转换用户程序 是执行主体的认识。 了解OS可提供的服务及服务方式。 充分利用OS提供服务功能解决实际问题。 尽量使编写的程序最大限度的满足系统平台 的支持能力。Unix operating systemUnix operating system1. gcc 与 gdb 1.1 UNIX和C语言 C 是一种在 UNIX 操作

3、系统的早期就被广泛使用的通用 编程语言,它最早是由贝尔实验室的 Dennis Ritchie 为 了 UNIX 的辅助开发而写的。 C 是所有版本的UNIX上的系统语言。 几乎任何一种计算机上都有至少一种能用的 C 编译器 ; 并且它的语法和函数库在不同的平台上都是统一的 。 80年代末期美国国家标准协会(American National Standards Institute)发布了一个被称 为 ANSI C 的 C 语言标准,这保证了在不同平台上的C的 一致性。7Unix operating systemUnix operating system1. gcc 与 gdb 1.2 GNU

4、C编译器 GNU C 编译器(gcc)是一个全功能的 ANSI C 兼容编译器 ,它是所有UNIX系统可用的C编译器。 gcc是可以在多种硬体平台上编译出可执行程序的超级 编译器,其执行效率与一般的编译器相比平均效率要 高20%30%。8Unix operating systemUnix operating system3.1 LINUX下C语言编程概述Unix operating systemUnix operating system1. gcc 与 gdb gcc编译过程: 预处理,对源代码文件中的文件包含(include)、预编译 语句(如宏定义define等)进行分析。 编译,就是把C

5、/C+代码“翻译”成汇编代码。 汇编,将第二步输出的汇编代码翻译成符合一定格式 的机器代码,生成以.o为后缀的目标文件。 链接,将上步生成的目标文件和系统库的目标文件和 库文件链接起来,最终生成了可以在特定平台运行的 可执行文件。10Unix operating systemUnix operating system1. Gcc编译流程解析 如本章开头提到的,Gcc的编译流程分为了4个步骤,分别为: 预处理(Pre-Processing); 编译(Compiling); 汇编(Assembling); 链接(Linking)。 下面就具体来查看一下Gcc是如何完成4 个步骤的。 首先,有以下h

6、ello.c源代码: #include int main() printf(“Hello! This is our embedded world!n“); return 0; 3.3 Gcc编译器Unix operating systemUnix operating system(1)预处理阶段 在该阶段,编译器将上述代码中的stdio.h编译进来,并且 用户可以使用Gcc的选项“-E”进行查看,该选项的作用是 让Gcc在预处理结束后停止编译过程。 rootlocalhost Gcc# Gcc E hello.c o hello.i 在此处,选项“-o”是指目标文件,由上表可知,“.i” 文件

7、为已经过预处理的C 原始程序。以下列出了hello.i文 件的部分内容: typedef int (*_gconv_trans_fct) (struct _gconv_step *, struct _gconv_step_data *, void *, _const unsigned char *, _const unsigned char *, _const unsigned char *, unsigned char *, size_t *); Unix operating systemUnix operating system # 2 “hello.c“ 2 int main() pri

8、ntf(“Hello! This is our embedded world!n“); return 0; 由此可见,Gcc确实进行了预处理,它把“stdio.h” 的内容插入到hello.i文件中。Unix operating systemUnix operating system(2)编译阶段 接下来进行的是编译阶段,在这个阶段中,Gcc 首先要检查代码的规范性、 是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,Gcc 把 代码翻译成汇编语言。用户可以使用“-S”选项来进行查看,该选项只进行编 译而不进行汇编,生成汇编代码。 rootlocalhost Gcc# Gcc S h

9、ello.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, function main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl

10、 $15, %eax .section .note.GNU-stack,“,progbitsUnix operating systemUnix operating system(3)汇编阶段 汇编阶段是把编译阶段生成的“.s”文件转成目标文件,读者在此可使用选项“- c”就可 看到汇编代码已转化为“.o”的二进制目标代码了。如下所示: rootlocalhost Gcc# Gcc c hello.s o hello.oGcc编译器Unix operating systemUnix operating system(4)链接阶段 在成功编译之后,就进入了链接阶段。在这里涉及到一个重要的概念:函数

11、库 。读者可以重新查看这个小程序,在这个程序中并没有定义“printf”的函数实现 ,且在预编译中包含进的“stdio.h”中也只有该函数的声明,而没有定义函数的 实现,那么,是在哪里实现“printf”函数的呢?最后的答案是:系统把这些函数 实现都被做到名为libc.so.6的库文件中去了,在没有特别指定时,Gcc 会到系 统默认的搜索路径“/usr/lib”下进行查找,也就是链接到libc.so.6库函数中去,这 样就能实现函数“printf”了,而这也就是链接的作用。函数库一般分为静态库和 动态库两种。静态库是指编译链接时,把库文件的代码全部加入到可执行文件 中,因此生成的文件比较大,但

12、在运行时也就不再需要库文件了。其后缀名一 般为“.a”。动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行 文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开 销。动态库一般后缀名为“.so”,如前面所述的libc.so.6就是动态库。Gcc在编译 时默认使用动态库。完成了链接之后,Gcc就可以生成可执行文件,如下所示 。 rootlocalhost Gcc# Gcc hello.o o hello 运行该可执行文件,出现正确的结果如下。 rootlocalhost Gcc# ./hello Hello! This is our embedded world!Uni

13、x operating systemUnix operating systemGcc编译选项:Gcc编译器Unix operating systemUnix operating system1. UNIX下的C语言开发环境 gcc遵循的文件类型规定 .c为后缀的文件,C语言源代码文件; .a为后缀的文件,是由目标文件构成的档案库文件; .C,.cc或.cxx 为后缀的文件,是C+源代码文件; .h为后缀的文件,是程序所包含的头文件; .i 为后缀的文件,是已经预处理过的C源代码文件; .ii为后缀的文件,是已经预处理过的C+源代码文件; .m为后缀的文件,是Objective-C源代码文件;

14、.o为后缀的文件,是编译后的目标文件; .s为后缀的文件,是汇编语言源代码文件; .S为后缀的文件,是经过预编译的汇编语言源代码文件 。18Unix operating systemUnix operating system头文件 头文件是用来提供常量的定义和系统和函数调用 的声明,这些头文件通常放在/usr/include和其子 目录中。根据不同的Linux版本,头文件可能放在 /usr/include/sys和/usr/include/linux.#include Unix operating systemUnix operating system库函数 库函数是一些预先编译好的函数的集合

15、,这些函数可以有 很好的重用性。通常来讲,它们包含有相关的函数集合来 完成一项常用任务。典型的库函数有屏幕处理函数(curses和ncurses库)和数据库访问函数(dbm库)。 标准系统函数通常存放在/lib和/usr/lib中。C编译器需要被 告知搜索哪个库,否则缺省情况下只搜索标准库。 传统静态库 .a Examples are /usr/lib/libc.a and /usr/X11/lib/libX11.a for the standard C library and the X11 library 共享库 .so On a typical Linux system, the sha

16、red version of the standard math library is /usr/lib/libm.soUnix operating systemUnix operating system1. gcc 与 gdb 1.5 gdb调试和分析选项 gdb 基本命令 file 装入想要调试的可执行文件; kill 终止正在调试的程序; list 列出产生执行文件的源代码的一部分; next 执行一行源代码但不进入函数内部; step 执行一行源代码而且进入函数内部; run 执行当前被调试的程序; quit 终止 gdb ; watch 使你能监视一个变量的值而不管它何时被改变; b

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 中学教育 > 教学课件

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号