什么是gcc
gcc全称是GNU Compliler Collection,他是一个能够编译多种语言的编译器,发展到现在已经不是刚开始大家以为的C语言编译器那样了(GNU C Compiler),现在除了C语言还支持C++,java,Pascal等语言,同时还支持多种硬件。
gcc的特点
- gcc是一个可移植的编译器,支持多种硬件平台。例如ARM、X86等等。
- gcc不仅是个本地编译器,它还能跨平台交叉编译。所谓的本地编译器,是指编译出来的程序只能够在本地环境进行运行。而gcc编译出来的程序能够在其他平台进行运行。例如嵌入式程序可在x86上编译,然后在arm上运行。
- gcc有多种语言前端,用于解析不同的语言。
- gcc是按模块化设计的,可以加入新语言和新CPU架构的支持。
- gcc是自由软件。任何人都可以使用或更改这个软件。
gcc编译程序的过程
gcc编译程序主要经过四个过程:
- 预处理(Pre-Processing)
- 编译 (Compiling)
- 汇编 (Assembling)
- 链接 (Linking)
预处理实际上是将头文件、宏进行展开。编译阶段,gcc调用不同语言的编译器,例如c语言调用编译器ccl。gcc实际上是个工具链,在编译程序的过程中调用不同的工具。汇编阶段,gcc调用汇编器进行汇编。链接过程会将程序所需要的目标文件进行链接成可执行文件。汇编器生成的是可重定位的目标文件,学过操作系统,我们知道,在源程序中地址是从0开始的,这是一个相对地址,而程序真正在内存中运行时的地址肯定不是从0开始的,而且在编写源代码的时候也不能知道程序的绝对地址,所以重定位能够将源代码的代码、变量等定位为内存具体地址。下面以一张图来表示这个过程,注意过程中文件的后缀变化,编译选项和这些后缀有关。
gcc常用选项
选项名 | 作用 |
---|---|
-o |
产生目标(.i,.o,.s、可执行文件等) |
-E |
只允许C预编译器 |
-S |
告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s |
-c |
通知gcc取消连接步骤,即编译源码,并在最后生成目标文件 |
-Wall |
使用gcc对源文件代码有问题的地方发出警告 |
-Idir |
将dir目录加入搜索头文件的目标路径 |
-Ldir |
将dir目录加入搜索库文件的目标路径 |
-llib |
连接lib库 |
-g |
在目标文件种嵌入调试信息,以便gdb之内的调试程序调试 |
现在我们有源文件hello.c,下面是一些gcc的使用示例:
gcc -E hello.c -o hello.i //对hello.c文件进行预处理,生成了hello.i 文件
gcc -S hello.i -o hello.s //对预处理文件进行编译,生成了汇编文件
gcc -c hello