理解GCC编译流程 - Hello World

说明

c 说明
c++ 说明
gcc 说明
原文参考 http://www.gainstart.cn
本文主要介绍和记录gcc编译流程及原理。过多的概念和名词这里就不做解释。主要还是说明gcc的编译原理。

准备

hello world C代码编写

首先我们先准备 helloworld.c 源码文件,内容如下

#include
int main(){
    printf("hello world");
    return 1;
}

gcc 简单使用

gcc helloworld.c

使用gcc helloworld.c命令 默认在当前目录下生成 a.out 执行文件,这时我们可以使用命令 ./a.out 执行此文件

特别参数说明

指定生成 可执行文件名 gcc helloworld.c -o helloworld 使用 -o 参数
打印提示信息 gcc -Wall helloworld.c
打印编译详细信息 gcc -v helloworld.c

解析 gcc 编译过程

gcc 编译过程分为 预处理(预处理文件.i) -> 编译(汇编文件.s) -> 汇编(目标文件.o) -> 链接(可执行文件.exe | a.out)

gcc 编译

。gcc 默认编译命令只会生成可执行文件,如果要生成中间文件 可以加 -save-temps 生成。如:gcc -save-temps helloworld.c -o helloworld 结果如图所示:
image.png

接下来我们分别对这些文件加以说明

预处理

gcc首先会做预处理,并生成预处理文件,文件后缀名为 .i
以下列出预处理会做的事情(当然预处理做的事不止这些)。

  1. 头文件展开 (不检查语法错误)
  2. 宏定义替换 (只做简单替换)
  3. 替换注释 (空行代替注释)
  4. 展开条件编译
    使用 -E 可以生成预处理文件,如下
gcc -E helloworld.c -o helloworld.i

编译

编译是把预处理文件编译成汇编语言,文件后缀名为.s
使用-S 生成汇编文件,如下

gcc -S helloworld.i -o helloworld.s

汇编内容如图


image.png

汇编

汇编过程是将汇编文件编译成二进制文件,文件后缀为.o
使用-c 可以生成二进制文件,如下:

gcc -c helloworld.s -o helloworld.o

链接

链接过程是将二进制文件链接成可执行文件。
编译时不用加任何参数,如下:

gcc helloworld.o -o helloworld

你可能感兴趣的:(理解GCC编译流程 - Hello World)