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)编译而成。

相关推荐

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

    2023-12-09 04:02:05       51 阅读
  2. Linux Ubuntu 24.04 C语言gcc编译过程详解

    2023-12-09 04:02:05       31 阅读
  3. gc和gccgo编译器

    2023-12-09 04:02:05       32 阅读
  4. 【Linux】GCC编译器(七)

    2023-12-09 04:02:05       38 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2023-12-09 04:02:05       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2023-12-09 04:02:05       101 阅读
  3. 在Django里面运行非项目文件

    2023-12-09 04:02:05       82 阅读
  4. Python语言-面向对象

    2023-12-09 04:02:05       91 阅读

热门阅读

  1. 十年婚姻·总结六

    2023-12-09 04:02:05       66 阅读
  2. 【C++ Primer Plus学习记录】逻辑表达式

    2023-12-09 04:02:05       52 阅读
  3. Codeforces Round 913 (Div. 3) (A-G)

    2023-12-09 04:02:05       43 阅读
  4. syslog定期rotate和限制其size的配置方法ubuntu上

    2023-12-09 04:02:05       51 阅读
  5. methods

    2023-12-09 04:02:05       51 阅读
  6. ELK技术栈介绍及简单使用实例

    2023-12-09 04:02:05       69 阅读
  7. Qt之面试经验

    2023-12-09 04:02:05       60 阅读
  8. 算法工程师-机器学习面试题总结(2)

    2023-12-09 04:02:05       41 阅读
  9. 优化代码质量:SOLID原则与有效的Code Review实践

    2023-12-09 04:02:05       52 阅读
  10. Redisson出现问题总结

    2023-12-09 04:02:05       55 阅读
  11. 后端返回图片流前端展示图片

    2023-12-09 04:02:05       59 阅读
  12. C语言实现ARM MCUJTAG离线调试器

    2023-12-09 04:02:05       55 阅读
  13. YOLOv7 学习笔记

    2023-12-09 04:02:05       56 阅读
  14. [递归] 平衡矩阵

    2023-12-09 04:02:05       53 阅读