学科分类
目录
Linux编程

GCC编译器

GCC(GUN Compiler Collection,GUN编译器套件)是由GUN开发的编程语言编译器,其初衷是实现基于GUN操作系统的编译。GCC编译器由原来的只能处理C语言文件,扩展为支持Fortean、Pascal、Java、Objective-C等多种编程语言,现已被大多数类Unix操作系统采纳为标准的编译器,GCC同样适用于Windows操作系统。

1、 GCC编译流程

GCC的编译过程分为四个步骤,分别是预处理(Perprocess)、编译(Compilation)、汇编(Assembly)和链接(Linking)。此处将以名为“hello.c”的C语言文件为例,对GCC的编译流程进行分析讲解。hello.c文件中的代码具体如下:

#include <stdio.h>
int main()
{
  printf(“hello itheima!\n”);
  return 0;
}

(1)预处理

预处理阶段主要处理源代码中以“#”开头的预编译指令和一些注释信息,处理规则如下:

● 删除代码中的“#define”,展开所有宏定义;

● 处理条件编译指令,如#if、#ifdef、#undef等;

● 将由“#include”包含的文件插入到预编译指令对应的位置,若文件中包含其它文件,同样进行替换;

● 删除代码中的注释;

● 添加行号和文件标识;

● 保留#pragma编译器指令。

预处理所用选项为“-E”,对hello.c文件进行预处理的命令如下:

[itheima@localhost ~]$ gcc **–E** hello.c –o hello.i

其中“-o”选项的功能是指定生成文件的文件名,以下各步骤中选项“-o”的功能与此处相同。经过此步骤之后,会生成一个名为hello.i的文件,此时若查看hello.i文件中的内容,会发现“#include <stdio.h>”一行被头文件stdio.h的内容替换。若源文件中有宏定义、注释、条件编译指令等信息,编译器也会按照上文所述处理规则对其进行处理。

(2)编译

在编译阶段,GCC会对经过预处理的文件进行语法、词法和语义分析,确定代码实际要做的工作,若检查无误,则生成相应的汇编代码文件。编译所用选项为“-S”,操作方法如下:

[itheima@localhost ~]$ gcc **–S** hello.i –o hello.s

经过此步骤之后,会生成一个名为hello.s的文件。

(3)汇编

该过程将编译后生成的汇编代码转换为机器可以执行的命令,即二进制指令,每一个汇编语句几乎都会对应一条机器指令。汇编所用选项为“-o”,操作方法如下:

[itheima@localhost ~]$ gcc **–c** hello.s –o hello.o

此时hello.o文件中的内容为机器码。

(4)链接

链接的过程是组装各个目标文件的过程,在这个过程中会解决符号依赖和库依赖关系,最终生成可执行文件。操作方法如下:

[itheima@localhost ~]$ gcc hello.o –o hello

经过以上4个步骤,最终生成了可执行文件hello。

GCC可以将单个文件编译成可执行文件,也可以编译链接多个文件,生成可执行文件,一般情况下我们不关心编译过程,只关心编译结果,此处只是通过编译步骤中对应的命令讲解了编译的流程,下面将结合实例,就单文件编译和多文件编译分别做出讲解。

2、 单文件编译

以上文给出的hello.c文件为例进行单文件编译,将该文件编译为可执行文件最简单的方法,是在命令行键入如下命令:

[itheima@localhost ~]$ gcc hello.c

编译的过程中,GCC编译器会先将源文件编译为目标文件,再将目标文件链接到可执行文件,之后删除目标文件。编译完成之后,当前目录会生成一个默认名为“a.out”的目标文件。此时在命令行中键入可执行文件名,就会执行该程序并打印执行结果。文件执行命令及执行结果如下:

[itheima@localhost ~]$ ./a.out
hello itheima!

使用gcc命令生成的所有可执行文件的默认名称都是“a.out”,若想指定可执行文件的名字,可以使用“-o”选项,假设将编译后生成的可执行文件命名为“hello”,则在命令行键入的命令如下:

[itheima@localhost ~]$ gcc hello.c –o hello

3、 多文件编译

当源程序较复杂时,可以将一个源程序分别写在多个文件中,如此便可以独立编译每个文件。下面我们将一个实现整数相加功能的程序分别写在三个文件中,以此来介绍GCC中多文件编译的方法。

假设这三个文件分别为: _add.h、_add.c、fc_add.c,其中的代码分别如下:

_add.h         //头文件,加法函数声明
int _add(int a,int b);
_add.c         //加法函数定义
#include "_add.h"
int _add(int a,int b)
{
  int c = a + b;
  return c;
}
_main.c        //主函数文件
#include <stdio.h>
#include "_add.h"
int main()
{
  int a = 10; 
  int b = 5;
  int c = _add(a,b);
  printf("c = %d\n",c);
  return 0;
}

则使用gcc编译多个文件的指令如下:

[itheima@localhost ~]$ gcc _main.c _add.c _add.h -o _main

其中_main为生成的可执行文件。执行文件_main,其结果如下:

[itheima@localhost ~]$ ./_main 
c = 15
点击此处
隐藏目录