#include <stdio.h>
int main()
{
printf("hello, world\n");
}
对于一个如上简单的hello world程序,在Linux环境+gcc下,其转化为可执行文件的历程大致如下:
STEP 1: 预处理
预处理器(cpp)根据以字符#开头的命令(directives),修改原始C程序。如hello.c中#include <stdio.h> 指令告诉预处理器读系统头文件stdio.h的内容(比如各种函数的声明),并将其直接插入到程序文本中。结果就得到了另外一个C程序,通常是以.i作为文件扩展名的。
指令:gcc -E hello.c -o hello.i
STEP 2: 编译
在这个阶段中,编译器(ccl)检查代码的规范性、语法正确性,并确定代码实际要做的工作,将hello.i翻译成包含了汇编语言程序的hello.s文件。
指令:gcc -S hello.i -o hello.s
STEP 3: 汇编
汇编器(as)将hello.s翻译成机器语言指令(二进制代码),生成一种叫做可重定位目标程序格式的文件hello.o。
指令:gcc -c hello.s -o hello.o
STEP 4: 链接
在成功编译之后,即进入了链接阶段。汇编程序中可能还有许多没有解决的问题,如某个源文件中的函数可能引用了另一个源文件中定义的某个符号(如变量或者函数调用)、在程序中可能调用了某个库文件中的函数。上述问题,都需要经链接程序的处理才能得以解决。链接程序的主要工作就是将有关的目标文件彼此相连接,即将在一个文件中引用的符号同该符号在另外一个文件中的定义连接起来,使得所有的这些目标文件成为一个能够执行的统一整体。链接结束后,便生成了一个可执行目标文件。
指令:gcc hello.o -o hello(.out) #.out可有可无
另外,执行gcc hello.c -o hello(或gcc -o hello hello.c)可直接生成可执行目标文件。