一、gcc编译器简介
1、gcc编译器的发展
编辑器(如vi、记事本)是指我用它来写程序的(编辑代码),而我们写的代码语句,电脑是不懂的,我们需要把它转成电脑能懂的语句,编译器就是这样的转化工具。就是说,我们用编辑器编写程序,由编译器编译后才可以运行!
编译器是将易于编写、阅读和维护的高级计算机语言翻译为计算机能解读、运行的低级机器语言的程序。
gcc(GNU Compiler Collection,GNU 编译器套件)是由 GNU 开发的编程语言编译器。
gcc原本作为GNU操作系统的官方编译器,现已被大多数类Unix操作系统(如Linux、BSD、Mac OS X等)采纳为标准的编译器,gcc同样适用于微软的Windows。
GCC最初代表“GNU C Compiler”,当时只支持C语言。 后来又扩展能够支持更多编程语言,包括 C、C++、Java、Ada、fortran、Object C、Object C++、Go语言 等。 因此,GCC也被重新定义为“GNU Compiler Collection”,成为历史上最优秀的编译器, 其执行效率与一般的编译器相比平均效率要高 20%~30%。
GCC的官网地址为:https://gcc.gnu.org/,在Ubuntu系统下系统默认已经安装好GCC编译器,可以通过如下命令查看Ubuntu系统中GCC编译器的版本及安装路径:
2、gcc编译工具链
GCC编译工具链(toolchain),是指以GCC编译器为核心的一整套工具。它主要包含以下三部分内容:
- gcc-core:即GCC编译器,用于完成预处理和编译过程,把C代码转换成汇编代码。
- Binutils :除GCC编译器外的一系列小工具包括了链接器ld,汇编器as、目标文件格式查看器readelf等。
- glibc:包含了主要的 C语言标准函数库,C语言中常常使用的打印函数printf、malloc函数就在glibc 库中。
在很多场合下会直接用GCC编译器来指代整套GCC编译工具链。
二、gcc/g++编译完整步骤(流程)
gcc编译器从拿到一个c源文件到生成一个可执行程序,中间一共经历了四个步骤:
四个步骤并不是gcc独立完成的,而是在内部调用了其他工具,从而完成了整个工作流程:
hello.c文件:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(void)
{
printf("hello world\n");
return 0;
}
deng@itcast:~/share/3rd/1gcc$ ls
deng@itcast:~/share/3rd/1gcc$ hello.c
- 第一步: 预处理-Pre-Processing(生成
.i
文件)# -E 选项指示编译器仅对输入文件进行预处理 deng@itcast:~/share/3rd/1gcc$ gcc -E hello.c -o hello.i
- 第二步: 编译-Compiling (生成
.s
文件)# -S 编译选项告诉 g++ 在为 C++ 代码产生了汇编语言文件后停止编译 # g++ 产生的汇编语言文件的缺省扩展名是 .s deng@itcast:~/share/3rd/1gcc$ gcc -S hello.i -o hello.s
- 第三步: 汇编-Assembling(生成
.o
文件)# -c 选项告诉 g++ 仅把源代码编译为机器语言的目标代码 # 缺省时 g++ 建立的目标代码文件有一个 .o 的扩展名。 deng@itcast:~/share/3rd/1gcc$ gcc -c hello.s -o hello.o
- 第四步: 链接-Linking(生成可以执行文件)
# -o 编译选项来为将产生的可执行文件用指定的文件名 deng@itcast:~/share/3rd/1gcc$ gcc hello.o