1. 简介

C语言程序从源代码到可执行文件(二进制文件)都经历了那些过程?本文以Linux下C语言的编译过程为例,讲解C语言程序的编译过程。
以hello.c文件为例:

#include <stdio.h>
int main(){
    printf("hello world!\n");
}

在linux下编译C程序:

$ gcc hello.c -o hello # 编译
$ ./hello # 执行
hello world! # 输出文本

2. 编译的步骤

gcc命令编译C语言的过程中依次执行了四步操作:

  1. 预处理(Preprocessing)
  2. 编译(Compilation)
  3. 汇编(Assemble)
  4. 链接(Linking)
    在这里插入图片描述
2.1 预处理(生成.i文件)

预处理器对源代码其进行一些文本性质的操作, 主要任务包括:

  1. 删除注释
  2. 插入被 #include 指令包含的文件内容
  3. 替换由 #define 定义的符号
  4. 确定代码的部分内容是否应该根据一些条件编译指令进行编译

预处理会生成一个.i的文件。

命令:

gcc -E hello.c -o hello.i
2.2 编译(生成.s文件)

编译器gcc把预处理后的文件进行语法分析、语义分析以及优化后生成汇编代码文件

命令:

gcc -S hello.i -o hello.s
2.3 汇编(生成.o文件)

汇编器把汇编代码文件转换成中间目标文件
命令:

gcc -c hello.s -o hello.o  // 注意:此处-c为小写
2.4 链接(生成可执行文件)

链接器把目标文件与所需要的附加的目标文件(如静态链接库、动态链接库)链接起来成为可执行的文件
命令:

gcc hello.o -o hello
Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐