Linux 中的编译器 GCC 的编译原理和使用详解

一.什么是GCC?

GCC的全称是GNU Compiler Collection ,即GNU编译器套件。它是由GNU项目开发的一组编程语言编译器,最初是为GNU操作系统设计的。

主要功能:

GCC支持多种编程语言,包括C、C++、Objective-C、Fortran、Java、Ada和Go等。它不仅可以处理这些语言的源代码,还可以生成相应的目标代码和可执行文件。

安装GCC

在 Ubuntu 系统中,可以使用以下命令安装 GCC:

cpp 复制代码
sudo apt update
sudo apt install build-essential

GCC 的基本语法如下:

cpp 复制代码
格式gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]

二.GCC的使用

主要分四步

  1. 预处理------预处理功能主要包括宏替换,去注释,条件编译等

  2. 编译------生成汇编

  3. 汇编------生成机器可识别代码

  4. 连接------生成可执行文件或库文件

写入之后通过以下命令编译该程序:

hello.c就是我们需要编译的文件,-o是gcc的一个选项,作用是将编译后的可执行文件给定一个文件名,hello就是我们所指定的文件名,输入ls可以查看

接下来就是运行

三.GCC如何完成编译

gcc是如何处理的,能让hello.c这样一个C语言文件生成一个可执行程序hello的呢?

下面是对这四步进行详解:

预处理

• 预处理功能主要包括宏定义,文件包含,条件编译,去注释等。

• 预处理指令是以#号开头的代码行。

• 实例: gcc --E hello.c --o hello.i

• 选项"-E",该选项的作用是让gcc在预处理结束后停止编译过程。

• 选项"-o"是指目标文件,".i"文件为已经过预处理的C原始程序。

预处理的结果是一个扩展名为 .i 的中间文件,包含了所有的宏替换和文件包含后的代码。

编译

在这个阶段,GCC 将预处理后的源代码转换为汇编语言。编译器会将每个源文件解析成相应的汇编指令

词法分析:将源代码分解成 tokens(词法单元)。

语法分析:根据语言的语法规则检查语句的正确性。

语义分析:检查程序的语义,例如变量是否已定义、类型是否匹配等。

gcc -S hello.i -o hello.s

编译的结果是一个扩展名为 .s 的汇编语言文件。

汇编

汇编阶段的任务是将汇编语言代码转换为机器码。GCC 使用汇编器(如 as)将 .s 文件转换为目标文件(.o 文件)。目标文件是二进制格式,包含了机器码和必要的符号信息。

cpp 复制代码
gcc -c -hello.s -o hello.o

链接

链接器(如 ld)将一个或多个目标文件和所需的库文件(如标准库)结合起来,生成最终的可执行文件。

cpp 复制代码
gcc hello.o -o hello

总结:GCC 的编译过程可以概括为以下几个步骤

预处理 :处理宏和头文件,生成 .i 文件

编译 :将 .i 文件转换为 .s 汇编文件

汇编 :将 .s 文件转换为 .o 目标文件

链接 :将 .o 文件和库文件链接,生成可执行文件。

感谢各位大佬观看!!!

相关推荐
Saniffer_SH24 分钟前
【每日一题】一台可编程的PCIe 6.0主机 + 一套自动化CTS验证平台 + 一个轻量级链路分析系统
运维·服务器·测试工具·fpga开发·自动化·计算机外设·硬件架构
吕司24 分钟前
Linux线程的概念
linux·运维·服务器
河南博为智能科技有限公司31 分钟前
智能变电站辅控系统解决方案!
运维·边缘计算
江西省遂川县常驻深圳大使1 小时前
openclaw.json配置示例
服务器·json·openclaw
飞Link1 小时前
深度掌控 Agent 调试:LangGraph 本地服务器与 Studio 核心指南
运维·服务器·jvm
古月方枘Fry2 小时前
三层交换+单臂路由+ACL网络配置
服务器·网络·智能路由器
驾驭人生2 小时前
ASP.NET Core 实现 SSE 服务器推送|生产级实战教程(含跨域 / Nginx / 前端完整代码)
服务器·前端·nginx
CDN3602 小时前
SDK 游戏盾接入闪退 / 初始化失败?依赖冲突与兼容修复
运维·游戏·网络安全
KOYUELEC光与电子努力加油2 小时前
JAE日本航空电子推出满足汽车市场小型防水最新需求的MX80系列连接器
服务器·科技·单片机·汽车
123过去3 小时前
hashid使用教程
linux·网络·测试工具·安全