一.预处理
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 (可执行文件)