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

C语言——编译和链接

编译和链接

  • 环境
    • 翻译环境
      • 预处理
      • 编译
      • 汇编
      • 链接
    • 运行环境

环境

在ANSI C的任何一种实现中存在两种不同的环境:

  1. 翻译环境(将源代码翻译为可执行的机器指令即二进制指令)
  2. 执行环境(用于执行代码)

一般来讲,翻译环境是编译器,执行环境是操作系统。


翻译环境

将源代码翻译为可执行的机器指令即二进制指令 / 源文件变为可执行程序文件
在这里插入图片描述

Windows系统中的目标文件就是以 .obj 为结尾的。
linux系统中的目标文件就是以 .o 为结尾的。

链接库是指运行时库(它是支持程序运行的基本函数集合)或者第三方库。

cl.exe是编译器。
link.exe是链接器。

Microsoft Visual Studio 是集成开发环境,包含了:编辑器、编译器、链接器、调试器、等。

下面是Linux环境下的gcc文件,编译链接如下:
在这里插入图片描述

编译又被分为:预处理、编译、汇编 三个部分。

C语言代码(.c.h) —> 预处理(.i) —> 编译(.s) — 汇编(.o) —> 链接 —> 可执行程序(.exe)

预处理

在这里插入图片描述

编译

编译过程就是将预处理后的文件进行⼀系列的:词法分析、语法分析、语义分析及优化,生成相应的汇编代码文件。

编译之后的文件里就是汇编。

词法分析

将源代码程序被输入扫描器,扫描器的任务就是简单的进⾏词法分析,把代码中的字符分割成⼀系列、的记号(关键字、标识符、字⾯量、特殊字符等)。

语法分析

对扫描产生的记号进行语法分析,从而产生语法树。这些语法树是以表达式为
节点的树。

在这里插入图片描述
代码->词法分析->语法分析

语义分析

由语义分析器来完成语义分析,即对表达式的语法层面分析。

编译器所能做的分析是语义的静态分析。静态语义分析通常包括声明和类型的匹配,类型的转换等。这个阶段会报告错误的语法信息。
静态分析:不执行代码,只做分析。
在这里插入图片描述

汇编

汇编器将汇编代码转变成机器可执行的指令,每⼀个汇编语句几乎都对应⼀条机器指令。
根据汇编指令和机器指令的对照表⼀⼀的进行翻译。(只做翻译)

链接

链接是⼀个复杂的过程,链接的时候需要把⼀堆文件链接在⼀起才生成可执行程序。
链接过程主要包括:地址和空间分配,符号决议和重定位等这些步骤。
链接解决的是⼀个项目中多文件、多模块之间互相调用的问题。


运行环境

  1. 程序必须载入内存中。在有操作系统的环境中:⼀般这个由操作系统完成。

  2. 在独立的环境中(比如嵌入式),程序的载入必须由手工安排,也可能是通过可执行代码置入只读内存来完成。

  3. 程序的执行便开始。接着便调用main函数。

  4. 开始执行程序代码。这个时候程序将使用⼀个运行时堆栈(stack),存储函数的局部变量和返回地址。程序同时也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程⼀直保留他们的值。(因此动态申请的内存一定要free否则会一直占用空间)

  5. 终止程序。正常终止main函数;也有可能是意外终止。

上述过程就是程序的大致运行流程。

http://www.dtcms.com/a/315805.html

相关文章:

  • 【RabbitMQ】高级特性—持久性、重试机制详解
  • GO如何设置代理
  • Python 中的 Matplotlib:安装与使用指南
  • 雷达水位监测站:让水位监测变得轻松又可靠!
  • Linux驱动25 --- RkMedia音频API使用增加 USB 音视频设备
  • 基于springboot的宠物领养系统的设计与实现(源码+论文+PPT答辩+开题报告)
  • Redis存储string里面embstr和raw格式区别
  • 新浪新闻获取
  • Redis里面什么是sdshdr,可以详细介绍一下吗?
  • Erdős–Rényi (ER) 模型
  • 克莱姆法则(Cramer‘s Rule)求解两条直线交点坐标的步骤
  • Redis 常用数据类型 (下)
  • AR眼镜成本挑战与突破路径:技术创新引领产业变革
  • Opencv: cv::Mat支持的类型汇总
  • 当送餐机器人学会“思考“:Deepoc如何赋予机器人具身智能
  • AI-03a1.Python深度学习-Tensorflow和Keras入门
  • eBay退货管理深度解析:筑牢售后防线,驱动账号长效稳健发展
  • AutoSar AP LT规范中 建模消息和非建模消息都可以使用LogInfo() API吗?
  • visual studio 历史版本安装
  • FLAN-T5:大规模指令微调的统一语言模型框架
  • 为什么要选择时序数据库IoTDB?
  • Redis实现可重入锁
  • “Why“比“How“更重要:层叠样式表CSS
  • 《C++初阶之STL》【模板参数 + 模板特化 + 分离编译】
  • @【JCIDS】【需求论证】联合能力集成与开发系统知识图谱
  • 机器学习通关秘籍|Day 03:决策树、随机森林与线性回归
  • 【工程化】tree-shaking 的作用以及配置
  • Android Framework代码屏蔽未接来电振动及声音通知
  • DHTMLX重磅发布React Scheduler组件,赋能日程管理开发!
  • SELinux加固Linux安全