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

89.【C语言】编译和链接

1.翻译环境和运行环境总述

翻译环境:源代码被转换为机器码(又称为二进制指令)(包含编译和链接两个过程)依赖此环境

运行环境:可执行程序(Windows下的*.exe)到输出结果依赖此环境

2.翻译环境

翻译环境的解释

拆分为预处理(又称为预编译),编译和汇编三个过程

VS下的编译器:cl.exe,VS下的链接器:link.exe

编译器:一个或多个*.c文件(多个c文件会经过编译器的单独处理)-->*.obj(Windows下的目标文件) 链接器:*.obj+链接库-->*.exe

链接库:运行时库(它是支持程序运行的基本函数集合)或者第三方库,例如stdio.h包含了许多库函数

其实在VS2022的项目的目录下可以看到

保护模式下的DOSBox的编译和链接过程

如果有DOSBox的使用经验,便可以轻松理解上述的概念

1.编译1.asm的命令masm 1.asm

会产生三个文件:1.OBJ,NUL.LST,NUL.CRF

2.链接命令link 1;

执行完后会看到生成的两个文件

把编译器展开成3个过程的图

经历的几个过程

预处理(预编译)

源文件和头文件会被处理成为.i 为后缀的文件

1.删除所有的#define,并展开所有的宏定义
2.处理所有的条件编译指令,如: #if,#ifdef,#elif,#else,#endif
3.处理#include预编译指令,将包含的头文件的内容插入到该预编译指令的位置.这个过程是递归进行的,也就是说被包含的头文件也可能包含其他文件
4.删除所有的注释
5.添加行号和文件名标识,方便后续编译器生成调试信息等
6.或保留所有的#pragma的编译器指令,编译器后续会使用

编译

进行词法分析,语法分析,语义分析及优化等操作,生成汇编代码

汇编

汇编器将汇编代码转变成机器可执行的指令

链接

解决一个项目中多文件、多模块之间互相调用的问题

3.运行环境

1. 程序必须载入内存中才能运行

在操作系统的环境(保护模式下)中:由操作系统为程序分配内存

在独立的环境(实模式下)中:程序的载入必须手动安排,也可能是通过可执行代码置入只读内存来完

成(如单片机的下载(也称烧录))

2. 程序的执行的开始:调用main函数

3. 执行程序代码:程序将使用一个运行时堆栈(函数栈帧),存储函数的局部变量和返回地址.程序同时

也可以使用静态(static)内存,存储于静态内存中的变量在程序的整个执行过程一直保留他们的值

由关函数栈帧的详细讲解参见

36.【C语言】函数栈帧的创建和销毁

E40.【C语言】练习:有关栈帧的讨论(反汇编分析)

4. 终止程序:正常终止main函数或意外终止

http://www.lryc.cn/news/467731.html

相关文章:

  • 优秀学员统计
  • 电脑程序变化监控怎么设置?实时监控电脑程序变化的五大方法,手把手教会你!
  • 2.1.3 编码和调制(下)
  • 【网络安全渗透测试入门】之XSS漏洞检测、利用和防御机制XSS游戏(非常详细)收藏这一篇就够了!
  • [ComfyUI]Flux:超赞古风少女LORA,唯美江南水乡小桥流水轻舟江南美人
  • 从蚂蚁金服面试题窥探STW机制
  • 【MySQL数据库】MySQL高级语句(SQL语句进阶版)
  • Milvus 到 TiDB 向量迁移实践
  • springboot集成jsoup解析xml文件
  • 基于Springboot相亲网站系统的设计与实现
  • 解决提示”warning C317 attempt to redefine macro ‘XX‘“问题
  • 3D图片动画效果组件封装
  • 高级优化算法之 fminunc函数 实践
  • 1.5 ROS架构
  • Redis Search系列 - 第四讲 支持中文
  • 架构师备考-架构图设计案列
  • 专业级Facebook直播工具推荐:提升你的直播体验
  • 【NodeJS】NodeJS+mongoDB在线版开发简单RestfulAPI (三):Cors的设置及.env文件的设置
  • [python flask 数据库ORM操作]
  • 【JavaScript】如何优雅的编码if判断中的一个变量多个或条件
  • SaaS云诊所系统源码,基于云计算技术的SAAS模式诊所管理系统,适用于诊所、门诊、卫生服务站、卫生站
  • 字节,AI产品经理面试,拿下offer!
  • Postgresql pgsql 插件之postgis 安装配置
  • 单片机STC8H8K64U开发板_RA6809开发板 驱动彩屏显示
  • Redis底层和缓存雪崩,击穿,穿透
  • [Java基础] 集合框架
  • 机器学习基础:算法如何让 AI 自我学习
  • 25届字节跳动 抖音NLP算法工程师 面经
  • 转行网络工程师以后的就业前景如何?
  • docker 和 containerd 关系