Linux gcc编译过程介绍

简介

GNU CC(通常称为GCC)是GNU项目的编译器,他能够编译C、C++语言编写的程序。使用gcc,程序员可以对编译过程有更多控制,编译过程分为4个阶段。
--预处理
--编译
--汇编
--链接
程序员可以在编译的任何阶段结束后体质整个编译过程以检查编译器在该阶段输出的信息
使用gcc,程序员可以控制生成二进制执行文件中调试代码的数量和类型。
和其他编译器一样,gcc也可以优化执行代码
gcc是个交叉平台编译器,所有能够在当前CPU平台上为不同操作系统开发软件
gcc对C和C++进行了一些扩展,有助于提高执行效率以及编译器进行代码优化。
gcc可以让跨平台编程更加容易,降低代码移植代价。

预处理

编译过程的第一步预就是预处理,与处理结束后会产生一个后缀为(.i)的临时文件,这一步由预处理器完成。预处理器主要完成以下任务。

a.删除所有的注释
b.宏扩展
c.文件包含

预处理器会在编译过程中删除所有注释,因为注释不属于程序代码,它们对程序的运行没有特别作用。
宏是使用 #define 指令定义的一些常量值或表达式。宏调用会导致宏扩展。
文件包含是在预处理期间将另一个包含一些预写代码的文件添加到我们的C程序中。它是使用#include指令完成的。在预处理期间源代码中添加头文件中的全部内容,从而替换#include<文件名>指令,从而创建新的中间文件。

gcc -E -I./inc test.c -o test.i
上述命令中-E是让编译器在预处理之后就退出,不进行后续编译过程;-I指定头文件目录,这里指定的是我们自定义的头文件目录;-o指定输出文件名。

编译

这里的编译不是指程序从源文件到二进制程序的全部过程,而是指将经过预处理之后的程序转换成特定汇编代码(assembly code)的过程。编译的指定如下:

gcc -S -I./inc test.c -o test.s
上述命令中-S让编译器在编译之后停止,不进行后续过程。

汇编

汇编过程将上一步的汇编代码转换成机器码(machine code),这一步产生的文件叫做目标文件,是二进制格式。gcc汇编过程通过as命令完成:

$ as test.s -o test.o
等价于:

gcc -c test.s -o test.o
这一步会为每一个源文件产生一个目标文件。

链接

链接是将库文件包含在我们的程序中的过程。
gcc -o hello hello.o

 

 

 

posted on 2016-08-12 17:09  寒魔影  阅读(2557)  评论(0编辑  收藏  举报

导航