GCC编译的4个阶段
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
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

本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
