c语言的编译步骤

1
gcc 编译  hello.c -o 生成的目标(可执行文件)名字为 world

预处理

1
gcc -E hello.c -o hello.i

带#的语句就是预处理指令,预处理指令在预处理的时候处理了

  • 头文件展开: #include <stdio.h> 包含文件stdio.h预处理时将stdio.h 文件拷贝至预处理文件中

  • 删除注释: 注释有两种方法: // /* */

  • 宏替换: #define 代表是声明一个宏,在预处理时会将宏给替代 (预处理的时候就会替换)

  • 预处理时 不会检查语法错误

  • 条件编译: 条件不成立: #if 0 -> #endif 条件成立 #if 1 -> #endif

    • c语言中 0表示不成立 1表示成立
  • 宏定义展开、头文件展开、条件编译等,同时将代码中的注释删除,这里并不会检查语法

编译

1
gcc -S hello.i -o hello.s
  • 预处理文件编译生成汇编文件 检查语法错误
  • 检查语法,将预处理后文件编译生成汇编文件

汇编

1
gcc -c hello.s -o hello.o
  • 汇编文件编译生成二进制文件.o

  • 将汇编文件生成目标文件(二进制文件)

链接

1
gcc    hello.o -o hello
  • 设置运行环境堆栈等,链接其他库
  • C语言写的程序是需要依赖各种库的,所以编译之后还需要把库链接到最终的可执行程序中去

1

选项 含义
-E 只进行预处理
-S(大写) 只进行预处理和编译
-c(小写) 只进行预处理、编译和汇编
-o file 指定生成的输出文件名为 file
文件后缀 含义
.c C 语言文件
.i 预处理后的 C 语言文件
.s 编译后的汇编文件
.o 编译后的目标文件

一步编译

1
gcc hello.c -o demo(还是经过:预处理、编译、汇编、链接的过程):