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

2023-12-09 02:05
文章标签 编译 过程 编译器 gcc gun

本文主要是介绍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)编译而成。

这篇关于GUN编译器(gcc/g++)- 编译过程的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/472101

相关文章

Spring boot整合dubbo+zookeeper的详细过程

《Springboot整合dubbo+zookeeper的详细过程》本文讲解SpringBoot整合Dubbo与Zookeeper实现API、Provider、Consumer模式,包含依赖配置、... 目录Spring boot整合dubbo+zookeeper1.创建父工程2.父工程引入依赖3.创建ap

Linux下进程的CPU配置与线程绑定过程

《Linux下进程的CPU配置与线程绑定过程》本文介绍Linux系统中基于进程和线程的CPU配置方法,通过taskset命令和pthread库调整亲和力,将进程/线程绑定到特定CPU核心以优化资源分配... 目录1 基于进程的CPU配置1.1 对CPU亲和力的配置1.2 绑定进程到指定CPU核上运行2 基于

java使用protobuf-maven-plugin的插件编译proto文件详解

《java使用protobuf-maven-plugin的插件编译proto文件详解》:本文主要介绍java使用protobuf-maven-plugin的插件编译proto文件,具有很好的参考价... 目录protobuf文件作为数据传输和存储的协议主要介绍在Java使用maven编译proto文件的插件

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

SpringBoot整合liteflow的详细过程

《SpringBoot整合liteflow的详细过程》:本文主要介绍SpringBoot整合liteflow的详细过程,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋...  liteflow 是什么? 能做什么?总之一句话:能帮你规范写代码逻辑 ,编排并解耦业务逻辑,代码

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL中的InnoDB单表访问过程

《MySQL中的InnoDB单表访问过程》:本文主要介绍MySQL中的InnoDB单表访问过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、访问类型【1】const【2】ref【3】ref_or_null【4】range【5】index【6】

浏览器插件cursor实现自动注册、续杯的详细过程

《浏览器插件cursor实现自动注册、续杯的详细过程》Cursor简易注册助手脚本通过自动化邮箱填写和验证码获取流程,大大简化了Cursor的注册过程,它不仅提高了注册效率,还通过友好的用户界面和详细... 目录前言功能概述使用方法安装脚本使用流程邮箱输入页面验证码页面实战演示技术实现核心功能实现1. 随机

Navicat数据表的数据添加,删除及使用sql完成数据的添加过程

《Navicat数据表的数据添加,删除及使用sql完成数据的添加过程》:本文主要介绍Navicat数据表的数据添加,删除及使用sql完成数据的添加过程,具有很好的参考价值,希望对大家有所帮助,如有... 目录Navicat数据表数据添加,删除及使用sql完成数据添加选中操作的表则出现如下界面,查看左下角从左