在linux系统上,从源文件到目标文件的转化是由编译器完成的。以hello.c程序的编译为例,如下:
dfcao@linux: gcc -o hello hello.c
在这里,gcc编译器读取源文件hello.c,并把它翻译成一个可执行文件 hello。
这个翻译过程可分为四个阶段逐步完成:预处理,编译,汇编,链接,如下图所示。
逐步做下简单分析:
在未编译前,hello.c 的源代码如下
#include <stdio.h>
int main()
{
printf("hello, world\n");
}
第一步、预处理阶段
执行命令: gcc -o hello.i -E hello.c
或者 cpp -o hello.i hello.c (这里cpp不是值c plus plus,而是预处理器the C Preprocessor)
预处理器cpp根据以字符开头#开头的命令,修改原始C程序。比如hello.c中的第一行为 #include <stdio.h>,预处理器便将stdio.h的内容直接插入到程序中。
预处理之后得到文本文件hello.i,打开如下
# 1 "hello.c" # 1 "<built-in>" # 1 "<命令行>" # 1 "hel