gcc简介
gcc的全称是GNU Compiler Collection
,即GNU编译器套件.从名称可以看出来,gcc产出于GNU项目,它的初衷是为了给GNU操作系统专门写一款编译器,以解决不同GNU系统间编译器混乱的问题.现在,它已经可以编译众多语言,例如C, C++, Objective-C, Fortran, Ada, Go.并且成为了C, C++编译器的首选
gcc编译过程
废话少说,先上图:
如上,gcc的整个编译过程经历了预处理,编译,汇编,链接这几个过程
预处理
gcc会调用cpp程序进行预处理,将源代码文件中的文件包含语句(include
),预编译语句(define
等)进行分析和替换,并去掉注释
C源文件:
1 |
|
执行gcc -E hello.c -o hello.i
后的输出文件:
1 | ... |
如上,include
语句被替换为一段超长的代码,而define
语句则被其语义所替代
编译
在预处理后,轮到编译器将源C代码编译成不可读的汇编代码.例如,执行gcc -S hello.i -o hello.s
生成汇编文件:
1 | .file "hello.c" |
汇编文件似乎比预处理后的C文件小了很多???还是说由于只用到了printf函数,其他绝大多数代码都是没有用的信息-.-
汇编
接下来gcc调用汇编器as将汇编文件汇编为二进制文件.例如gcc -c hello.s -o hello.o
查看文件属性:
1 | $ file hello.o |
链接
汇编后的二进制文件还不能执行,最后gcc会调用链接器ld链接二进制文件和其所需的库函数,使之成为真正的可执行文件.例如gcc -o hello hello.o
查看文件属性:
1 | $ file hello |
gcc参数
1 | -E:仅仅预处理,不编译,汇编,链接 |
杂项
就C,C++的编译器来说,除了原本的GCC编译器,基于LLVM的CLANG编译器也较为流行