GUN编译器(gcc/g++)- 编译过程

说明

gcc test.c -o test
g++ test.cpp -o test
  • 如上,可以很简单的使用一条命令将源码编译成可执行文件,但是实际上编译过程是一个比较复杂的工作,gcc/g++只是编译系统的入口程序,解析用户输入的参数,顺序调用预处理器(cpp)、编译器(ccl/cclplus)、汇编器(as)、链接器(ld),完成以下四个编译过程,生成可执行文件。
  1. 预编译
  2. 编译
  3. 汇编
  4. 链接

编译过程

预编译(Prepressing)

  • 对代码进行预处理(即编译前的处理),执行源码中的预处理指令,例如:文件导入(#include),宏定义展开(#define)等,输出结果是C代码。

编译(Compilation)

  • 将预编译产生的代码文件转化为汇编代码,输出结果是汇编代码。

汇编(Assembly)

  • 将编译产生的汇编代码进行汇编编译,输出的二进制的目标文件.o。

链接(Linking)

  • 将汇编编译产生的.o文件,链接成可执行程序文件(.out)。

使用

灵活

  • 使用gcc/g++编译非常灵活
  1. 可以从源码开始到任何一个步骤停止(-o 可以将输出结果输出到文件),例如:
gcc -E test.c -o test_new.i // -E: 执行完预编译, 输出预编译结果
gcc -S test.c -o test.s    // -S: 执行完编译,输出汇编代码
gcc -c test.c -o test.o    // -c: 执行完汇编,输出目标文件
gcc test.c -o test        // 执行完所有过程,输出可执行文件
  1. 也可以从编译过程的任何一个步骤继续编译,任意一个步骤停止,例如:
* 从预处理开始
gcc -E test.c -o test.i
gcc -S test.i -o test.s  //将预处理后的代码编译成汇编代码
gcc -c test.i -o test.o  //将预处理后的代码编译成目标文件
gcc test.i -o test  //将预处理后的代码编译成可执行文件
* 从汇编开始
gcc -S source_file.c -o source_file.s // 编译成汇编代码 source_file.s
gcc source_file.s -o source_file // 将汇编代码编译成可执行程序
gcc -c source_file.s -o source_file.o  //将汇编代码编译成目标文件(.o) 
* 从目标文件(.o)开始
gcc -c source_file.c -o source_file.o // 编译成目标文件 source_file.o
gcc source_file.o -o source_file // 将目标文件链接成可执行程序

强大

  • gcc/g++不仅仅是一个C/C++编译器,也可以完成汇编器(as)和链接器(ld)的工作。
  • 汇编和链接工作,也可以使用as和ld来实现,但是需要手动加很多参数,使用gcc就简单很多。

汇编器

  1. 将汇编代码编译成可执行程序
gcc source_file.s -o source_file  //将汇编代码,编译成可执行程序,如果汇编代码中没有main函数会提示,可先编译成.o文件
  1. 将汇编代码编译成.o文件
gcc -c source_file.s -o source_file.o //将汇编代码,编译成.o文件

链接器

  1. 链接成可执行程序
gcc source_file.o xxx.o -o source_file  //将.o文件链接成可执行文件,
  • .o 文件可以从.c编译而成,也可以从汇编代码(.s)编译而成。

你可能感兴趣的:(#,编译链接,编译过程)