GCC编译的4个阶段

您所在的位置:网站首页 gcc编译过程包括 GCC编译的4个阶段

GCC编译的4个阶段

2023-08-26 11:50| 来源: 网络整理| 查看: 265

GCC编译一共有4个阶段:预处理、编译、汇编、链接。 gcc指令的一般格式

gcc [选项] 要编译的文件 [选项] [输出文件] 选项说明-E控制 GCC 编译器仅对源代码做预处理操作-S控制GCC 编译器仅对指定文件处理至编译阶段-c控制GCC 编译器仅对指定文件处理至汇编阶段,并生成相应的目标文件-o outfile指定输出文件的文件名eg:下面是一段很简单的hello.c代码,以这段代码为例。 #include #define NAME "mao" void main(){ printf("hello:%s\n",NAME); }

1、预处理阶段 预处理阶段主要工作是删除程序中所有的注释、处理以# 开头的命令,如:头文件的展开、宏定义的替换。 对于上面的代码#include 表示引入头文件,在预处理阶段stdio.h文件就会被加载到我的hello.c中;而对于在代码中使用到的NAME,就会被替换成该宏所定义的真实内容"mao"。可以使用下面的命令执行预处理:生成.i文件,linux系统中预处理后所得文件的后缀名通常是.i

gcc -E hello.c -o hello.i

在这里插入图片描述

2、编译阶段 gcc在编译阶段会对预处理后的代码进行各种检查(词法分析、语法分析、语义分析),来判断我们代码是否符合规范,如果通过就会生成汇编代码(以.s结尾的文件) 注意:gcc -S 不是只能编译经过预处理后的.i文件,它的涵义是控制GCC 编译器仅对指定文件处理至编译阶段。

如果需要编译的文件是经过预处理后的 .i 文件,则 GCC 编译器只需编译此文件。如果需要编译的文件是 .c 或者 .cpp 源文件,则 GCC 编译器会对其进行预处理和编译(两步)。 gcc -S hello.i -o hello.s

在这里插入图片描述 3、汇编阶段 把 .s 文件翻译成二进制.o文件(目标文件) 注意:gcc -c 不是只能编处理.s文件,它的涵义是控制GCC 编译器仅对指定文件处理至汇编阶段。

如果指定文件为.c文件,则 gcc -c 指令会对 该文件执行预处理、编译、汇编。如果指定文件为经过预处理后的.i文件,则 gcc -c 指令对该文件执行编译和汇编。如果指定文件为经过编译后的文件,则 gcc -c 指令只对该文件执行汇编操作。 gcc -c hello.s -o hello.o

在这里插入图片描述 4、链接阶段 汇编阶段将代码编译成了二进制文件,还需要和系统其他组件(比如标准库、动态链接库等)结合起来才能正常运行,比如调用print函数打印,在预处理阶段也只是将“stdio.h”头文件中的申明引入进来,没有函数的实现,那怎么调用它的呢?这就是链接的工作了,链接之前的操作都是对一个文件进行处理,而链接可以看作是对多个文件进行“打包”的过程,它将所有的目标文件以及系统组件组合成一个可执行文件。

gcc hello.o -o hello

在这里插入图片描述



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3