gcc编译器 编译的4个步骤

一.预处理

hello.c 经过预处理得到 hello.i

gcc -E hello.c -o hello.i

-E的含义:说明这是一个预处理操作 生成预处理文件(.i)

-o的含义:
确定 输出文件的名称output_filename 不能和源文件同名

预处理阶段做了什么事:

1.头文件展开

我们发现 原先只有几行的hello.c变成了上千行的hello.i 

实际上 预处理完成的是 将头文件展开

所有#include的内容全部插入源代码

并且不会检查语法错误

因此 但凡被#include的文件

所有文本内容都会被无脑插入源代码

2.宏定义替换

若#define x y 则将所有的x 以文本的层次 替换成y

什么叫做以文本的层次

就是说这是无脑替换 不会检查语法错误 所以有时要注意运算顺序 加括号

专业术语就是:将宏名替换为宏值

3.删除注释

注释是给人看的 计算机不看这些 将注释替换位空行

4.展开条件编译

根据实际的define情况

在代码中智能添加 //dosomething

5.(以后更新)

#ifdef something

//do something

#endif

二.编译

hello.i 经过编译得到 hello.s

gcc -S hello.s -o hello.s

-S的含义:说明这是编译操作 生成汇编文件(.s)

(也可以从源文件一步到达.s)

注意是大写S 生成的文件格式是小写s

生成汇编指令

向下翻译 生成了约几十行的文本内容

这是 最接近底层接近机器语言汇编语言(汇编指令)

编译过程会检查语法错误如果语法不正确无法生成汇编语言

相比之下 预处理过程不会检查语法错误

因此 编译过程是整个4步骤过程中最耗时的 因为语法错误要逐行检查

三.汇编

hello.s 经过汇编得到 hello.o

gcc -c hello.s -o hello.o

-c的含义:说明这是执行汇编操作 生成目标文件(.o)

(也可以从源文件一步到达.o)

hello.o 是二进制文本内容 

汇编指令被翻译成了二进制的机器指令

通常在记事本中以十六进制形成呈现

四.链接(以后更新)

gcc hello.o -o hello.exe

(也可以从源文件一步到达.exe)

1.数据段合并

2.数据地址回填

3.库引入

最后一步链接没有gcc参数

hello.o 经过链接 得到 hello.exe/hello.out (可执行文件)


版权声明:本文为u014285914原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。