gcc编译的四个过程

gcc是什么?

GNU编译器套件(GNU Compiler Collection)包括C、C++、Objective-C、Fortran、Java、Ada和Go语言的前端,也包括了这些语言的库(如libstdc++、libgcj等等)。GCC的初衷是为GNU操作系统专门编写的一款编译器。GNU系统是彻底的自由软件。

gcc编译的四个过程

gcc在执行编译工作的时,分为以下四个过程:
1.预处理,生成.i的文件
2.将预处理后的文件转换成汇编语言,生成.s文件
3.汇编变为目标代码(机器代码),生成.o的文件
4.连接目标代码,生成可执行程序

盗用一张图,图解过程如下:
在这里插入图片描述

这里我使用测试文件main.c来讲解gcc编译的四个过程

#include<stdio.h>
int main(void)
{
  //print hello world
  printf("Hello World\n");
  return 0;
}
1.预处理,生成main.i文件
gcc -E main.c -> main.i

在linux中,预处理后的文件以.i为后缀名,这个过程只激活预处理,不生成文件,因此你需要把它重定向到一个输出文件里 。
这一步的功能主要是宏的替换和注释的消除。

查看main.i文件
在这里插入图片描述

2.将预处理后的文件转换成汇编语言,生成.s文件
gcc -S main.c 

生成main.s文件,用编辑器打开查看
在这里插入图片描述

3.汇编变为目标代码(机器代码)生成.o的文件
gcc -c main.c 

在这里插入图片描述

4.连接目标代码,生成可执行程序
gcc main.o -o main

执行命令gcc main.o,默认生成a.out,这里我指定的是生成main执行文件,main与a.out是同文件不同名

查看main文件:
在这里插入图片描述

测试运行

生成的所有文件
在这里插入图片描述
执行结果:
./main
在这里插入图片描述

<think>嗯,用户想了解GCC编译四个阶段。我记得GCC编译过程分为预处理、编译、汇编和链接四个步骤。首先,预处理阶段处理宏和头文件,对吧?比如#include和#define这些指令会被展开。然后编译阶段把预处理后的代码转换成汇编代码。汇编阶段再把汇编代码转成机器码,生成目标文件。最后链接阶段把多个目标文件和库文件合并成可执行文件。 用户提供的引用内容里有三个资料,其中引用[1]提到四个步骤:预处理、编译、汇编和链接。引用[2]和[3]给出了具体的例子,比如main.c文件。可能需要详细解释每个步骤做了什么,以及对应的GCC命令参数。比如预处理用-E,编译用-S,汇编用-c,而直接生成可执行文件用-o。 用户可能需要知道每个阶段的具体操作,比如预处理阶段展开宏定义,处理条件编译指令,添加头文件内容等。编译阶段进行语法检查,生成汇编代码。汇编阶段生成二进制目标文件,链接阶段解决外部符号引用,链接库文件。 还要注意使用GCC命令的例子,比如gcc -E main.c -o main.i,这样用户可以看到如何实际操作。同时,可能需要解释每个阶段的输出文件是什么,例如.i文件、.s文件、.o文件和可执行文件。 另外,用户可能对每个阶段背后的原理感兴趣,比如编译阶段涉及词法分析、语法分析、优化等。链接分为动态链接和静态链接,可能需要简要说明区别。最后,生成相关问题时要围绕GCC四个阶段,比如优化方法,每个阶段的工具,调试方法等。</think>### GCC编译四个阶段详解 GCC编译过程分为**预处理、编译、汇编、链接**四个阶段,每个阶段完成不同的任务,最终生成可执行文件。以下是详细说明: --- #### 1. **预处理(Preprocessing)** **作用**:处理源代码中的预处理指令(如`#include`、`#define`、条件编译等),展开宏定义,并将头文件内容插入到源文件中。 **输入文件**:`.c`文件(如`main.c`) **输出文件**:`.i`文件(预处理后的文本文件) **命令示例**: ```bash gcc -E main.c -o main.i ``` **关键操作**: - 展开所有宏定义(例如`#define COUNTE 5`会被替换为`5`)[^3] - 处理条件编译指令(如`#ifdef`、`#endif`) - 将头文件(如`#include <stdio.h>`)的内容插入到源文件中[^2] --- #### 2. **编译(Compilation)** **作用**:将预处理后的代码转换为**汇编代码**,并进行语法检查和优化。 **输入文件**:`.i`文件 **输出文件**:`.s`文件(汇编语言文件) **命令示例**: ```bash gcc -S main.i -o main.s ``` **关键操作**: - 语法和语义分析(如检查变量类型是否正确) - 生成与平台相关的汇编代码(例如`printf`调用会被转换为汇编指令) - 代码优化(如删除冗余操作) --- #### 3. **汇编(Assembly)** **作用**:将汇编代码转换为机器码(二进制目标文件)。 **输入文件**:`.s`文件 **输出文件**:`.o`文件(目标文件) **命令示例**: ```bash gcc -c main.s -o main.o ``` **关键操作**: - 将汇编指令逐行翻译为机器指令 - 生成可重定位的二进制文件(尚未解决外部符号引用,如库函数`printf`的地址)[^1] --- #### 4. **链接(Linking)** **作用**:将多个目标文件(`.o`文件)和库文件(如C标准库)合并,生成最终的可执行文件。 **输入文件**:`.o`文件 **输出文件**:可执行文件(默认`a.out`,或通过`-o`指定名称) **命令示例**: ```bash gcc main.o -o main ``` **关键操作**: - 解析符号引用(例如将`printf`的调用链接到标准库中的实现) - 合并代码段、数据段等 - 静态链接或动态链接(默认动态链接,依赖系统库如`libc.so`)[^1] --- ### 完整编译流程示例 ```bash # 一步完成所有阶段,生成可执行文件 gcc main.c -o main ``` ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值