目录
文章目录
- 一、gcc编译C语言过程
- 1. 预处理阶段
- 2. 编译阶段
- 3. 汇编阶段
- 4. 链接阶段
- 二、示例
- 1.预处理
- 2.编译
- 3.汇编
- 4.链接
- 5.执行命令
一、gcc编译C语言过程
gcc编译C语言程序的过程分成四个阶段:预处理、编译、汇编和链接。
编译流程 | 命令 | 作用 | 解释 |
---|---|---|---|
预处理阶段 | gcc -E hello.c -o hello.i | 该过程会对各种预处理指令(以#开头的代码行,如#include,#define,#ifdef等等)进行处理,删除注释和多余的空白字符。 | E是参数,是通知gcc对hello.c进行预编译; o是参数,是对命令输出结果进行导入操作,这里是将gcc -E hello.c操作结果输出到文件hello.i(这里文件名可以自定义)进行保存 |
编译阶段 | gcc -s hello.i -o hello.s | 该过程会对代码进行语法、语义分析和错误判断,生成汇编代码文件。 | S是参数,用于通知gcc对目标文件hello.i进行编译。 |
汇编阶段 | gcc -c hello.s -o hello.o | 该过程会将汇编代码转化为计算机可识别的二进制文件。 | 对命令的解释:c是参数,用于通知gcc对文件hello.s进行指令转换操作。 |
链接阶段 | gcc hello.o -o hello | 该过程就是将多个.o文件合并成一个可执行文件(也就是二进制指令),类似windows下的.exe文件。 | 对命令的解释:hello就是我们最后能够直接运行的可执行文件。 |
1. 预处理阶段
在这一阶段,gcc会对源代码进行预处理。预处理器会扫描源代码,并处理以’#'开头的预处理指令,如#include、#define等,将它们转换为实际的代码。预处理器还会将头文件中的内容复制到源文件中,形成一个完整的源代码文件。使用-E
选项可以查看预处理后的代码。
2. 编译阶段
在这一阶段,gcc会将预处理后的源代码编译成汇编代码。gcc会对每个函数单独编译,并生成对应的汇编代码文件。使用-S
选项可以查看生成的汇编代码。
3. 汇编阶段
在这一阶段,gcc会将汇编代码转换成机器码。汇编器会将汇编代码翻译成可执行的二进制指令,并生成目标文件。使用-c
选项可以查看生成的目标文件。
4. 链接阶段
在这一阶段,gcc将目标文件与所依赖的库文件进行链接,生成可执行文件。链接器会将多个目标文件及其所依赖的库文件合并成一个可执行文件。使用-o
选项可以指定生成的可执行文件名。
在编译过程中,可以使用各种编译选项来控制编译过程。例如,-I
选项可以指定头文件的搜索路径,-L
选项可以指定库文件的搜索路径,-l
选项可以指定要链接的库文件,等等。
二、示例
接下来以一个简单的输出helloworld的程序演示一下这个过程。
hello.c
#include <stdio.h>
int main()
{
printf("HelloWorld!");
return 0;
}
1.预处理
预处理,生成预编译文件(.i文件)
gcc -E hello.c -o hello.i
将会产生 hello.i 文件,这就是 hello.c 经过预处理后的文件。
Vi 打开后进行查看。可以看到, hello.c 经过预处理后得到的 hello.i文件,除了原本的几行代码之外,还包含了很多额外的变量、函数等等,这些都是预处理器处理的结果。
2.编译
编译,生成汇编代码(.s文件)
gcc -S hello.i -o hello.s
3.汇编
得到了汇编文件后,通过 gcc 就可以得到机器码了。在终端输入下列命令,可以得到hello.o 目标文件。
gcc -c hello.s -o hello.o
4.链接
尽管已经得到了机器码,但这个文件却还是不可以运行的,必须要经过链接才能得到可执行文件。
在终端输入下列命令,将会得到可执行文件 a.out。
gcc hello.o
a.out 是 gcc 默认输出文件名称,可以通过-o 参数指定新的文件名。例如加上“-o hello”参数,将会生成 hello 文件,这个文件和 a.out 实际上是一样的。
5.执行命令
./a.out
补充:
上边内容也可以一步到位:
gcc hello.c
执行命令后直接生成a.out文件。
也可以编写Makefile文件,使用make 工具编译程序并执行。
详细请看:https://blog.csdn.net/m0_46202060/article/details/133934816?spm=1001.2014.3001.5501