Linux下C程序设计.doc
文本预览下载声明
第六章 嵌入式Linux编程
一.GNU/Linux平台C程序开发过程
在GNU/Linux环境下一个C程序从编辑到执行结束主要经历以下几个步骤,我们以经典的helloworld程序为例,详细介绍GNU/Linux平台下软件开发中各种工具的功能以及使用方法。
本文以我们最常见的hello, world!为例。以下是一个由C源代码转化为可执行文件的过程:
对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析。接着调用cc1进行编译,这个阶段根据输入文件生成以.o为后缀的目标文件。汇编过程是针对汇编语言的步骤,调用as进行工作,一般来讲,.S为后缀的汇编语言源代码文件和汇编、.s为后缀的汇编语言文件经过预编译和汇编之后都生成以.o为后缀的目标文件。当所有的目标文件都生成之后,gcc就调用ld来完成最后的关键性工作,这个阶段就是连接。在连接阶段,所有的目标文件被安排在可执行程序中的恰当的位置,同时,该程序所调用到的库函数也从各自所在的档案库中连到合适的地方
可执行程序的执行过程:生成可执行程序后,由操作系统调度完成执行,执行中的程序称之为进程。程序转化为进程的步骤如下:
1.? 内核将程序读入内存,为程序镜像分配内存空间。
2 ? 内核为该进程分配进程标志符(PID)。
3.? 内核为该进程保存PID及相应的进程状态信息。
经过上述步骤,可执行程序转变为进程,即可以被调度执行,得出运行结果。
二.Linux系统下完整开发环境构成
通过以上分析了解了C程序开发的整个过程,在整个开发过程中主要用到编辑器,编译器,调试器函数库和系统头文件等。所以一般情况下说Linux环境系统开发完整工具链主要包括
编辑器:选择vi(基本上任何版本都拥有vi,且用法基本一致,考虑到兼容性,选择vi编写源代码)
? 编译器:选择GNU c/c++ 编译器gcc
? 调试器:应用广泛的gdb(编写程序时的语法错误和逻辑错误调试和跟踪)
? 函数库:glibc
? 系统头文件:glibc_header?1.编译器gcc概述
GNU CC(简称gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++、Object C、Jave等多种语言编写的程序。gcc又可以作为交叉编译工具,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,非常适合在嵌入式领域的开发编译,如常用的arm-linux-gcc交叉编译工具。以下是gcc支持编译的源文件的后缀及其解释:
? .c为后缀的文件,c语言源代码文件
? .h为后缀的文件,是程序所包含的头文件
? .i为后缀的文件,是已经预处理过的c源代码文件
? .o为后缀的文件,是编译后的目标文件(连接后生成可执行文件)
? .s为后缀的文件,是汇编语言源代码的文件函数库glibc
? 要构架一个完整的c开发环境,glibc是必不可少的? glibc-2.0.6.tar.gz
? glibc-linuxthreads-2.0.6.tar.gz
? glibc-localledate-2.0.6.tar.gz(国际化文件)
? glibc-crypt-2.0.6.tar.gz(加密文件)
glibc是提供系统调用和基本函数的c库,如:open、malloc、printf等等,所有动态连接的程序都要用到它。
系统头文件glibc_header
? 缺少了系统头文件的话,很多用到系统功能的c程序将无法编译。? cpp-2.96-110.i386.rpm
? binutils-.2-11.i386.rpm
? glibc ......... .rpm
? gcc-2.96-110.i386.rpm
? make-3.79.1-8.i386.rpm
三.gcc的使用方法
1.gcc基本用法
gcc最基本的用法是:gcc [options] [filenames]其中,options就是编译器所需要的参数,filenames给出相关的文件名称,gcc编译器的调用参数大约有100多个,其中多数参数我们可能根本就用不到,这里只介绍其中最基本、最常用的参数-c??? :只编译,不链接成为可执行文件。编译器只是由输入的 .c 等源代码文件生成 .o 为后缀的目标文件,通常用于编译不包含主程序的子程序文件。-o output_filename??:确定输出文件的名称为output_filename。同时这个名称不能和源文件同名。如果不给出这个选项,gcc就给出默认的可执行文件 a.out 。-g: 产生符号调试工具(GNU的 gdb)所必要的符号信息。想要对源代码进行调试,就必须加入这个选项。-O:(大写的o) 对程序进行优化编译、链接。采用这个选项,整个源代码会在编译、链接过程中进
显示全部