
1)预编译:
gcc -E main.c -o main.i //将main.c预编译生成main.i文件

图示为将main.c预编译生成main.i文件
2)编译:
gcc -S main.i -o mian.s //将main.i编译生成main.s文件
预编译不检查语法,编译检查语法
3)汇编:
gcc -c main.s -o main.o //将main.s汇编生成main.o文件
4)链接:
gcc main.o -o main //将main.o生成main文件
链接就是将所有的.o文件 .a文件(静态库文件) .lib文件 .obj文件链接起来,生成.out文件(ELF格式的可执行文件,Windows是生成.exe文件)
每次都输入四步骤的话太麻烦,可用移步编译进行快速编译
移步编译:
1)一步执行:gcc -o main main.c
2)两步执行:gcc -c min.c -o main.o //先编译一下看是否有语法问题
gcc -o main main.o
启动进程:
路径+可执行文件名
(1)预编译阶段:
a)删除所有的"#define",并且展开所有的宏定义;
b)处理所有的条件预编译指令,"#if" ,"#ifdef" ,"#endif"等;
c)处理'#include"预编译指令,将被包含的文件插入到该预编译指令的位置;
d)删除所有的注释;
e)添加行号和文件名标识,以便于编译器产生调试用的符号信息及编译时产生编译错误和警告时
f)保留所有的#pragma编译器指令,因为编译器需要使用它们;
⑵编译阶段
词法分析,语法分析,语意分析,代码优化,汇总符号;
⑶汇编阶段
将汇编指令翻译成二进制格式,生成各个section,生成符号表
(4)链接阶段
a)合并各个section,调整section的起始位置和段大小,合并符号表,进行符号解析,给符号分配虚拟地址;
b)符号重定位,即在使用符号的地方全部替换成符号的虚拟地址;
