#include<stdio.h>
in main()
{
printf("hello word");
return 0;
}
打印hello word是一个最简单的代码.Linux下运行:$gcc hello.c $./a.out
就能打印出:hello word
其实编译(包括链接)的命令:gcc hello.c 可分解为如下4个大的步骤
- 预处理(Preprocessing)
- 编译(Compilation)
- 汇编(Assembly)
- 链接(Linking)
- 预处理,生成预编译文件(.文件)
命令格式 $Gcc –E hello.c –o hello.i
预处理的过程
1) 头文件展开
2) 宏替换
3) 去注释
4) 条件编译
5) 添加行号
- 编译,生成汇编代码(.s文件)
命令格式 Gcc –S hello.i –o hello.s
编译的过程 将C语言转为汇编语言
- 汇编,生成目标文件(.o文件)
命令格式:Gcc –c hello.s –o hello.o
汇编的过程 将汇编语言转化成二进制
- 链接,生成可执行文件
命令格式:Gcc hello.o –o hello
链接的过程 引入标准库函数
通过调用链接器ld来链接程序运行需要的一大堆目标文件,以及所依赖的其它库文件,最后生成可执行文件。
链接分为静态链接和动态链接
静态链接是指在编译阶段直接把静态库加入到可执行文件中去,这样可执行文件会比较大。但在运行时也就不再需要库文件了。其后缀名一般为”.a”。
动态链接则是指链接阶段仅仅只加入一些描述信息,而程序执行时再从系统中把相应动态库加载到内存中去。这样可以节省系统的开销。动态库一般后缀名为”.so”,Gcc在编译时默认使用动态库。