The GNU Compiler Collection,通常简称GCC,是一套由GNU开发的编译器集。为什么会是一个集合,因为它不仅支持C语言编译,还支持C++, Ada, bjective C等语言。另外GCC支持的硬件平台包括:X86处理器架构,ARM架构,MIPS架构。
GCC内部由Binutils, Gcc-core, Glibc等软件包组成。
1)Binutils:它是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。这个软件包会依不同的平台而不同,因为不同的架构指令集不同。
2)Gcc-core:GCC的核心部分,但是这部分默认只包含C的编译器及其公共部分,而对其他语言(C++, Ada等)的支持包需要另外安装。
3)Glibc:包含常用到的一些C的函数库,这个库提供基本的函数,用于分配内存,搜素目录,读写文件,字符串处理等。
对GNU编译器来说,程序的翻译要经过:预处理,汇编,编译,链接四个步骤。GCC经常把前三个合为一个步骤来操作,所以就有了编译模式(-c指定)和编译链接模式(-o指定输出)两种方式。
预处理阶段主要处理.h之类的头文件,#include,#ifdef,#define等。生成文件.i。
汇编阶段主要将.i的中间文件转换为汇编语言文件.s
编译阶段主要将汇编语言文件.s转换为2进制机器语言.o
链接阶段主要是将不同的机器语言文件链接到一起,生成最终的可执行文件。
GCC的基本用法:假设源文件程序名是test.c
1)无选项编译链接:gcc test.c 将test.c预处理,汇编,编译,链接成可执行文件,未指定输出文件,默认输出a.out。
2)-o指定输出文件:gcc test.c 将test.c预处理,汇编,编译,链接成可执行文件,指定输出文件,test.out。
3)-E只进行预处理:gcc -E test.c -o test.i 将test.c进行预处理操作,生成test.i文件。
4)-S只进行汇编:gcc -S test.i -o test.s 将test.i进行汇编操作,生成test.s文件。
5)-c只进行编译:gcc -c test.s 将test.s进行编译操作,生成test.o文件。
6)对编译后的文件进行无选项操作:gcc test.o -o test 将test.o链接生成可执行文件test。
多个文件处理:
gcc test1.c test2.c -o test 将test1和test2分别预处理,汇编。编译后链接为test可执行文件输出。
gcc test1.o test2.o -o test 将test1编译后文件和test2编译后文件,链接为test可执行文件输出。
交叉编译:在一种机器结构下编译的软件将在另一种完全不同的机器结构下执行。一个常见的例子是在PC机上编译运行在ARM,MIPS上的软件。由于GCC可以在命令行显式调用编译器,从而适合交叉编译。 arm-linux-gcc -o test.c。
arm-linux-gcc:基于ARM目标机的交叉编译软件,跟GCC所需的安装包不同,X86和ARM的指令集不同,所以Binutils不一样,gcc-core依赖于Binutils,所以gcc-core也不相同,glibc库不同。
arm-elf-gcc:也是基于ARM目标机的交叉编译软件。两者区别主要在glibc的不同。arm-linux-gcc使用GNU的glibc,而arm-elf-gc一般使用uClibc等专门为嵌入式系统开发的C库。Glibc针对PC开发,uClibc小型C语言库,实现Glibc的部分功能。
原文:http://www.cnblogs.com/-9-8/p/4463513.html