C语言编译流程

编译就是将高级语言编写的程序转化为二进制代码可执行程序的过程

编译分为四大过程:

  • 预处理
  • 编译
  • 汇编
  • 链接

预处理(preprocessing)

  • 完成宏替换、文件引入,以及去除空行、注释等,为下一步的编译做准备
  • 其实是对各种预处理指令进行处理,包括头文件的包含、宏定义的扩展、条件编译的选择等。

我们可以使用gcc编译器对c源文件进行预处理操作

# 输入指令
gcc -E test.c -o test.i 
#将test.c源文件进行预处理输出test.i
# -E:让gcc在预处理结束后停止编译,“test.i"文件为预处理后输出的文件。
# -o:指定输出文件

预处理

预处理前的文件大小为74bytes 预处理后的文大小为34kb

编译(Compilation)

  • 编译的过程就是将预处理后的代码编译成汇编代码的过程。在这个阶段,首先要检查代码的规范性、是否有语法错误等,以确定代码实际要做的工作,在检查无误后,再把代码翻译成汇编语言。
  • 汇编程序执行时,先分析,后综合。分析,就是指词法分析、语法分析、语义分析和中间代码生成。综合,就是指代码优化和代码 生成。
  • 大多数的编译程序直接产生机器语言的目标代码,形成可执行的目标文件,也有的是先产生汇编语言一级的符号代码文件,再调用汇编程序进行翻译和加工处理,最后产生可执行的机器语言目标文件。

利用上面预处理后的test.i文件进行编译操作

# 输入指令
gcc -S test.i -o test.s
# 将预处理后的test.i文件进行编译输出test.s
# -S:让gcc在编译结束后停止编译过程,文件为编译后生成的汇编代码。
编译

汇编(Assemble)

  • 汇编就是把编译阶段生成的 “.s” 文件转换成二进制目标代码,也就是机器代码(01序列)。
# 输入命令
gcc -c test.s -o test.o
# 将编译后生成的test.s文件进行汇编生成test.o
# -c让gcc在汇编结束后停止编译过程,"test.o"文件为汇编后生成的机器码目标文件
汇编

链接

  • 将多个目标文件以及所需的库文件链接生成可执行目标文件的过程。
# 输入命令
gcc test.o -o test
# 将test.o文件链接生成test可执行文件
# -o 本质是重命名选项。不使用-o选项时,默认生成的是a.out文件。这里生成的是可执行文件test.
链接

你可能感兴趣的:(C语言编译流程)