GNU编译器(GCC)原理简介 GNU编译器(GCC, GNU Compiler Collection)是GNU工具链的关键组件,与GNU、Linux相关项目的标准编译器。它设计之初仅用来处理C语言的(也被称为GNU C编译器),紧接着扩展到C++、Objective-C/C++、Fortran、Java、Go等编程语言。 目前,GCC已经被以知道各种指令集体系结构中,成为了自由软件、专有软件的开发工具。GCC编译器可以应用多种平台:操作系统(Linux/Windows)、移动端(Android/iSO)、嵌入式系统(Arm/FPGA)等。 1. GNU编译器(GCC)的编译过程 如图2-32所示,GCC的编译工程可以分为四个步骤: 1)预处理(Pre-Processing):使用CPP对C语言源程序进行预处理生成预处理.i文件,在该过程主要对源代码文件中的文件包含(include)、预编译语句(如宏定义define等)进行分析; 2)编译(Compiling):调用CC1将预处理后的.i文件编译汇编语言.s文件,这个阶段主要是对预处理文件进行转换以生成机器语言的目标程序; 3)汇编(Assembling):GCC调用AS对汇编语言.s文件进行汇编,生成目标文件.o; 4)链接(Linking):GCC调用LD将各个模块的.o文件连接起来生成一个可执行程序文件,该过程将目标文件/库文件指派到可执行程序各自对应的位置。 图2-32 GNU编译器(GCC)的编译过程 GCC编译过程中,每个步骤都会生成不同的文件格式,C/C++在编译过程中生成的文件类型,见表2-18。 表2-18 列举了C/C++在编译过程中生成的文件类型
文件后缀 |
描述 |
.c |
C语言源文件 |
.C/.cc/.cxx/.cpp |
C++ 源文件 |
.h |
C/C++ 头文件 |
.i/.ii |
经过预处理的 C/C++ 文件 |
.s/.S |
汇编语言源文件 |
.o/.obj |
静态库 |
.so/.dll |
动态库 |
命令 |
作用 |
-c |
只进行编译过程,而不链接成可执行文件,编译器只是将输入的源代码 |
|
生成符号调试工具(GNU的gdb)所需要的符号信息。 |
-E |
仅执行预处理操作,而不进行编译、汇编和链接操作 |
-S |
仅执行编译操作,而不进行汇编、链接操作 |
-O |
对程序进行优化编译、链接操作,提高可执行文件的执行效率 |
-o file_name |
设置输出文件名为file_name,注意输出文件名不能和源文件同名;如果不给出 |
快捷键 |
作用 |
g/G |
跳转到文档顶/底部 |
u/d |
向上(up)/下(down)翻动半页 |
f/b |
向上(forward)/下(backward)翻动一页 |
/ |
在文档中搜索内容,按下/在后面输入想要查询的内容 |
n/N |
跳转到下/上一个搜索的内容 |
q |
退出手册 |