二、编译和链接
2016-07-14 本文已影响48人
小虾米不爱吃虾
1. 源代码(hello.c)
#include <stdio.h>
int main()
{
printf("hello world!\n");
return 0;
}
2. 预编译过程
$ gcc -E hello.c -o hello.i
预编译过程包含如下几个关键步骤
-
#define
定义的宏全部删除,并且展开所有的宏定义 - 处理所有条件编译指令
#if 、#ifdef、#elif、#else、#endif
- 处理
#inlcude
预编译指令,将被包含的文件插入到该预编译的位置,这个过程可能是递归的 - 删除所有的
//
和/* */
- 添加行号和文件名标识,以便编译器编译或者调试的时候能输出行号信息
- 保留所有编译器相关的指令
我们可以通过hello.i文件,判断代码里定义的宏是否正确被展开
3. 编译过程
$ gcc -S hello.c -o hello.s
hello.s 是汇编代码
4. 汇编过程
$ gcc -c hello.s -o hello.o
hello.o 是目标文件,ELF格式
5. 链接过程
ld
命令可以完成链接过程
$gcc hello.c -o hello
包含了以上编译和链接的过程,直接生成了可执行文件。