Linux *** 作系统中默认安装的C语言编译系统是GCC(GNU Compiler Collection),是Linux下最常用的C语言编译器,是GNU项目中符合ANSI,C标准的编译系统,能够编译用C、Object C等语言编写的程序。
同时它可以通过不同的前端模块来支持各种语言,如Java、Fortran、Pascal、Modula,3和Ada等。
C语言的标准
1.1 K,RC
1973年,Dennis M Ritchie设计和实现了C语言,从那以后使用者逐渐增加。
1978年,Kernighan 和 Ritchie 合著了《The C Programming Language》,这本书定义的C语言被称为 K,RC 。
1.2 标准 C
随着C语言使用日益广泛,出现了许多新问题,人们迫切希望对C语言进行标准化。
第一个标准:C89
1983年,ANSI成立了一个委员会X3J11,对C语言进行标准化。
1989年,ANSI 批准了第一个C语言标准 X3,159-1989,并于1990年公布,被称为 ANSIC、C89 或 C90。
1990年,这个标准又被批准为ISO标准:ISO,IEC 9899:1990 。
ANSIC标准被ISO采纳,并且ISO发布的修订版也被ANSI采纳,因此ANSI标准和ISO标准实际上没有技术区别。这些名称的含义是相同的:ANSI C、ISO C、标准C。
1994年和1996年,ISO发布了两个技术更正,更正了1990ISOC标准中的错误。
第二个标准:C94
1995年,ISO发布了1990ISOC标准的一个补充,称为AMD1。扩充后的标准被称为C94或C95。
第三个标准:C99
1999年,ISO发布了一个新版本的ISOC标准:ISO,IEC9899:1999,称为C99。
2001年、2004年和2007年,ISO发布了三个技术更正,更正了1999ISOC标准中的错误。
第四个标准:C11
2011年,ISO发布了一个新版本的ISOC标准:ISO,IEC9899:2011,称为C11。C11 是 C语言的最新标准。
1.3 GNUC
1984年,Richard Stallman 发起了GNU计划,它的目标是开发一个完整且自由的Unix-like *** 作系统(GNU系统)。
GNU系统是一个完整的 *** 作系统,包括 *** 作系统内核和各种工具软件。各种GNU系统的变种(例如Redhat、Ubuntu等)已经被广泛使用,它们使用的 *** 作系统内核都是Linux。虽然这些系统经常被称为Linux,但准确地说,它们是GNU/Linux系统。
GNU在编写Linux时扩展了标准C,称为GNUC。
GNU C的扩展详见:Extensions to the C Language Family
GNU C也称为Linux C,一般用于Linux上的开发,而标准C可以跨平台。
GNU C使用的编译器是GCC。
采用交叉编译的主要原因在于,多数嵌入式目标系统不能提供足够的资源供编译过程使用,因而只好将编译工程转移到高性能的主机中进行。linux下的交叉编译环境重要包括以下几个部分:
1.对目标系统的编译器gcc
2.对目标系统的二进制工具binutils
3.目标系统的标准c库glibc
4.目标系统的linux内核头文件
交叉编译环境的建立步骤
一、下载源代码 下载包括binutils、gcc、glibc及linux内核的源代码(需要注意的是,glibc和内核源代码的版本必须与目标机上实际使用的版本保持一致),并设定shell变量PREFIX指定可执行程序的安装路径。
二、编译binutils 首先运行configure文件,并使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,然后执行make install。
三、配置linux内核头文件
首先执行make mrproper进行清理工作,然后执行make config ARCH=arm(或make menuconfig/xconfig ARCH=arm)进行配置(注意,一定要在命令行中使用ARCH=arm指定cpu架构,因为缺省架构为主机的cpu架构),这一步需要根据目标机的实际情况进行详细的配置,笔者进行的实验中目标机为HP的ipaq-hp3630 PDA,因而设置system type为SA11X0,SA11X0 Implementations中选择Compaq iPAQ H3600/H3700。
配置完成之后,需要将内核头文件拷贝到安装目录: cp -dR include/asm-arm $PREFIX/arm-linux/include/asm cp -dR include/linux $PREFIX/arm-linux/include/linux
四、第一次编译gcc
首先运行configure文件,使用--prefix=$PREFIX参数指定安装路径,使用--target=arm-linux参数指定目标机类型,并使用--disable-threads、--disable-shared、--enable-languages=c参数,然后执行make install。这一步将生成一个最简的gcc。由于编译整个gcc是需要目标机的glibc库的,它现在还不存在,因此需要首先生成一个最简的gcc,它只需要具备编译目标机glibc库的能力即可。
五、交叉编译glibc
这一步骤生成的代码是针对目标机cpu的,因此它属于一个交叉编译过程。该过程要用到linux内核头文件,默认路径为$PREFIX/arm-linux/sys-linux,因而需要在$PREFIX/arm-linux中建立一个名为sys-linux的软连接,使其内核头文件所在的include目录;或者,也可以在接下来要执行的configure命令中使用--with-headers参数指定linux内核头文件的实际路径。
configure的运行参数设置如下(因为是交叉编译,所以要将编译器变量CC设为arm-linux-gcc): CC=arm-linux-gcc ./configure --prefix=$PREFIX/arm-linux --host=arm-linux --enable-add-ons 最后,按以上配置执行configure和make install,glibc的交叉编译过程就算完成了,这里需要指出的是,glibc的安装路径设置为$PREFIXARCH=arm/arm-linux,如果此处设置不当,第二次编译gcc时可能找不到glibc的头文件和库。
六、第二次编译gcc
运行configure,参数设置为--prefix=$PREFIX --target=arm-linux --enable-languages=c,c++。
运行make install。
到此为止整个交叉编译环境就完全生成了。
几点注意事项
第一点、在第一次编译gcc的时候可能会出现找不到stdio.h的错误,解决办法是修改gcc/config/arm/t-linux文件,在TARGET_LIBGCC2_CFLAGS变量的设定中增加-Dinhibit_libc和-D__gthr_posix_h。
Linux 下可用的编译器有 GCC、EGCS 和 PGCC,其中最常用的编译器便是 GCC。
GCC 起初是 GNU 推出的 C语言编
译器,用于类 Unix 系统下的编程,所以名为 GNU C Compiler 。随着众多自由开发者的加入,GCC
发展迅速,如今已成为一个支持众多语言的编译器了,其中包括 C、C++、Ada、Object C 和 Java 等,以至于 GCC 开始被扩展为
GNU Compiler Collection ,也就是“GNU 编译器集合”的意思。
GCC用法:
1、GCC基本用法及其选项
gcc 或 g++ 的用法跟参数含义几乎一样,他们最基本的用法是:
2、只编译子程序(-c)
3、产生目标文件(-o)
4、附加调试信息(-g)
5、多文件编译
6、连接库文件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)