当前位置: 首页 > news >正文

【C语言】程序的编译和链接(基础向)

程序的编译和链接

  • 1、翻译环境和运行环境
  • 2、翻译环境
  • 3、预处理(预编译)
    • 3.1编译
    • 3.2汇编
    • 3.3链接
    • 3.4GCC编译过程分解
  • 4、运行环境

1、翻译环境和运行环境

ANSLC的任何一种实现中,存在两个不同的环境。

  1. 翻译环境:源代码—>可执行的机器指令(二进制指令)
  2. 执行环境:实际执行代码
    在这里插入图片描述

这就是当我们写代码:

#include<stdio.h>
int main()
{printf("hehe\n");return 0;
}

屏幕上会打印hehe的原理

2、翻译环境

翻译环境由编译链接两大过程组成,而编译又可以分解成:预处理、编译、汇编三大过程。
![[bit-2025-10-19-09-11-00.png]]

一个C语言的项目可以由多个.C文件组成,下面是组成的原理

  • 多个.C文件单独经过编译器,编译处理生成对应的目标文件

  • Windows环境下的目标文件的后缀是.obj,Linux环境下目标文件的后缀是.o

  • ![[bit-2025-10-19-09-15-02.png]]

  • 多个目标文件和链接库一起经过链接器处理生成最终的可执行程序

  • 链接库是指运行时库或第三方库

把编译器再展开3个过程,那就变成了下面图:
![[QQ20251019-093634.png]]

执行顺序:C代码 — 预处理 — 编译 — 汇编 — 链接 — 可执行程序

3、预处理(预编译)

在预处理阶段,源文件和头文件会被处理成为.i为后缀的文件
gcc环境下想观察对test.c文件预处理后的.i文件,命令为:

gxx -E test.c -o test.i

预处理阶段主要处理那些源文件中#开始的预编译指令。比如:#include,#define,处理的规则如下:

  • 将所有的#include预编译指令,如:#if、#ifdef、#dlif、#else、#endif
  • 处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置。这个过程时递归进行的,也就是说被包含的头文件也可能包含其他文件
  • 删除所有的注释
  • 添加行号和文件名标识,方便后续编译器生成调试信息等
  • 保留所有的#pragma的编译器指令,编译器后续会使用
    经过预处理后的.i文件中不再包含宏定义,因为宏已经被展开。并且包含的头文件都被插入到.i文件中。所以当我们无法知道宏定义或者头文件是否包含正确的时候,可以查看预处理后的.i文件来确认。

3.1编译

编译过程就是将预处理后的文件进行一系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件
编译过程的命令:
gcc -S test.i -o test.s

如果对下面代码
array[index] = (index + 4)*(2 + 6)
编译时,编译器会怎么做呢?
![[QQ20251019-103943.png]]

根据记号,会生成下列的语法树
![[QQ20251019-103847.png]]

3.2汇编

汇编器时将汇编代码转变成技巧可执行的指令
汇编命令如下:
gcc -c test.s -o test.o
![[QQ20251019-111253.png]]

3.3链接

当有两个甚至多个.c文件时,编译器是先把每个函数的链接合并到一起,然后再使用,如下图中的加法函数:
![[QQ20251019-111103.png]]

![[QQ20251019-111103.png]]

3.4GCC编译过程分解

// 分布执行,观察每个阶段的输出
gcc -E test.c //只预处理
gcc -S test.c //生成汇编代码
gcc -c test.c //生成目标文件
gcc test.o    //链接生成可执行文件

4、运行环境

  1. 程序必须载入内存中。在有操作系统的环境中:⼀般这个由操作系统完成。在独立的环境中,程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。
  2. 程序的执行便开始。接着便调用main函数。
  3. 开始执行程序代码。这个时候程序将使用一个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。
  4. 终止程序。正常终止main函数;也有可能是意外终止。
http://www.dtcms.com/a/506900.html

相关文章:

  • 基于单片机的热量计测量系统设计
  • 显卡功能及原理介绍
  • 丽水网站建设明恩玉杰百度网址导航
  • 时序数据库选型指南:从大数据视角看IoTDB的核心优势
  • 免费域名网站的网站后台用什么做
  • HTML应用指南:利用GET请求获取全国沃尔沃门店位置信息
  • WPF/C#:使用Microsoft Agent Framework框架创建一个带有审批功能的终端Agent
  • 『 QT 』信号-槽 补充: Qt信号槽断开连接与Lambda槽技巧
  • 为何海尔洗衣机屡屡发明新品类?
  • 【案例实战】HarmonyOS应用性能优化实战案例
  • 企业网站建设尚未实现宣传功能交互效果好的移动端网站
  • 10m带宽做下载网站深圳一公司今年新成立16家核检机构
  • 优麒麟(Ubuntu Kylin) 安装向日葵远程工具/ToDesk
  • 速卖通新号优惠券采购:自养号效率提升的安全要点
  • Linux InfiniBand代理模块深度解析:管理数据包的高效处理引擎
  • 开源协作2.0:GitHub Discussions+AI重构开发者社区的知识共创生态
  • Linux01:基础指令与相关知识铺垫(一)
  • QueryWrapper - MyBatis-Plus的“查询条件构建器“
  • Linux外设驱动开发1 - 单总线驱动开发__dht11
  • 使用高性能流式的库SpreadCheetah来添加图片和合并表格单元
  • 建设银行网站建设情况免费招聘的网站
  • 手机上怎么做微电影网站徐州做网站谁家最专业
  • 【Mathematics】椭圆眼睛跟随鼠标交互中的仿射变换数学推导
  • 【u-boot】u-boot的分区支持
  • CG-FS-A3 风速传感器 485型 体积小巧 便捷安装 三杯式 聚碳材质
  • http和https区别如何转https
  • 国外的主要电机生产厂商
  • 英伟达公司发展历史
  • 网站首页文件名通常是无锡市建设安全监督网站
  • SQL之参数类型讲解——从基础类型到动态查询的核心逻辑