编译过程 - 图1

  1. 预处理:头文件、宏展开
  2. 编译:
  3. 汇编:生成目标文件
  4. 链接:链接其他的程序库生成可执行文件

接下来先看gcc的常用选项:

选项名 作用
-o 产生目标(.i、.s、.o、可执行文件等)
-E 只运行C预编译器
-S 告诉编译器产生汇编程序文件后停止编译,产生的汇编语言文件拓展名为.s
-c 通知gcc取消连接步骤,即编译源码,并在最后生成目标文件
-Wall 使gcc对源文件的代码有问题的地方发出警告
-Idir 将dir目录加入搜索头文件的目录路径
-Ldir 将dir目录加入搜索库的目录路径
-llib 连接lib库
-g 在目标文件中嵌入调试信息,以便gdb之类的调试程序调试

下面看gcc模拟编译的几个步骤:

hello.c 文件内容

#include <stdio.h>
#define HELLO "hello!!\n"

int main(void)
{
        printf(HELLO);
        return 0;
}

预编译,之后查看hello.i文件可查看到宏展开、头文件展开等

gcc -E hello.c -o hello.i

编译,查看hello.s是个汇编文件

gcc -S hello.i -o hello.s

汇编

gcc -c hello.s -o hello.o

链接

gcc hello.o -o hello

上诉过程可以一次性完成,(编译生成可重定位目标文件)

gcc -c hello.c

gcc -c hello.c -o hello.o