main.c ==>main要经历四步骤: 预编译 编译 汇编 链接
一、预编译
- gcc -E main.c -o main.i
处理 “#”
(1)删除#define,并作文件替换
(2)递归展开头文件(头文件里还可以嵌套)
(3)处理预编译指令( 如#if #endif)
(4)删除所有注释
(5)添加行号和文件名标识
(6)保留#pragma指令
(#pragma lib 指定当前程序运行需要链接的库 所以在链接阶段处理)
二、编译
- gcc -s main.c -o main.s
(1)词法分析
(2)语法分析(一行表达式)
(3)语义分析(结合上下文)
(4)代码优化
(5)生成汇编指令 (仍是低级语言)
三、汇编
翻译指令
- gcc -c main.s -o main.o
注意 :汇编用./main.o不能运行的~!
原因有两个:一是符号地址未被确定;二是用的一些其他方法还未被链接
四、链接
- gcc main.o -o main
上面说了只有一个文件时的操作,当有多个文件时可以用下面的方法
假如有三个文件 main.c a.c b.c (只能有一个主函数)
(1)可多步完成:
gcc -c main.c
gcc -c a.c
gcc -c b.c
gcc -o main main.o a.o b.o
(2)可一步完成:gcc -o main main.c a.c b.c
小知识点Linux上可执行程序的文件格式是ELF;Windows上是PE格式