Cpp学习——编译链接

目录

​编辑

一,两种环境

二,编译环境下四个部分的

1.预处理

2.编译

3.汇编

4.链接

三,执行环境


一,两种环境

在程序运行时会有两种环境。第一种便是编译环境,第二种则是执行环境。如下图:

在程序运行时,首先会让源文件文件经过编译环境。在编译环境中,源文件会经过以下四个个过程:预处理,编译,汇编,链接。也就是说,编译环境还会细分为四个组成部分:

在经过编译环境的这四个部分以后便会生成。exe文件来执行相应代码要执行的任务。

二,编译环境下四个部分的

1.预处理

代码在编译环境下第一个要经历的便是预处理,也叫预编译。在这个部分,代码要被做以下处理:

**1.**头文件展开。

**2.**宏替换。

**3.**消除注释。

**4.**条件编译。(这个我不太懂)

在经过上面四步以后会生成一个.i文件,这个文件里的内容就是源文件在经过上面四步以后的内容。所以.i文件里的内容的行数会比源文件的行数要少。

2.编译

在这一步,要经历的过程便是以下几步:

1.语法分析。

2.词法分析。

3.语义分析。

4.符号汇总。

5.生成汇编代码。(指令级代码)。

6.生成.s文件。

我们平时写代码时如果发生语法错误便是在这一步检测出来的。并且在编译的过程中会对函数名进行重命名。在C语言中,在VS环境下对函数名进行重命名的规则便是在函数名前加一个"_"。但是在C++中,函数重命名则会根据参数的类型来重命名。所以,因为C++的这一项进步于是会C++便便支持了函数重载。

3.汇编

汇编的过程便是将指令代码翻译成机器码,也就是二进制码的后生成目标文件的过程。在这个过程中还要将程序里面的各个函数的函数名和地址给汇总起来生成符号表。在这个过程中要做的便是以下几步:

1.将汇编代码翻译成二进制的机器码。

2.生成目标文件。

3.生成符号表。

4.链接

链接的意思便是将程序中的多个文件链接起来共同完成一项任务。在这个过程中因为有多个目标文件,也就意味着有多个符号表。并且我们的代码是通过符号表里面的函数名和地址来跳转调用函数的。所以在链接时就必需要做到下面的几步:

1.合并段表。

2.合并符号表。

合并段表的目的是将多个目标文件给连接起来。合并符号表的目的是将各个目标文件里的符号表搞在一起方便查找。在这里要注意两种种链接错误的情况:

1.函数的声明和定义放在同一个文件中。

这样会导致链接错误的原因是有两个同名但是地址不同的函数在符号表中。在调用时便会出现歧义,导致错误。

2.只有声明,没有定义。

这样的错误是因为符号表里的声明的函数没有一个有效的地址。在调用时不知道该跳转到什么地方调用函数所以导致错误。

三,执行环境

在这个环境中便是生成.exe文件实现运行逻辑。

相关推荐
智者知已应修善业9 小时前
【4060BD_5V应用电路图】2022-12-24
驱动开发·经验分享·笔记·硬件架构·硬件工程
小弥儿9 小时前
GitHub今日热榜 | 2026-09-18:腾讯双项目上榜
学习·开源
知识分享小能手11 小时前
深度学习学习教程,从入门到精通,深度生成模型 —— 知识点详解与代码实现(20)
人工智能·深度学习·学习
m4Rk_12 小时前
【论文阅读】Agent 记忆机制(74):CompassMem——从相似度检索走向事件图上的记忆导航
论文阅读·人工智能·学习·开源·github
小李不想当小白12 小时前
DMA直接存储器存取(STM32标准库学习笔记)
笔记·stm32·单片机·嵌入式硬件·学习·分享
2601_9499506314 小时前
练题簿在线练题全流程:从资料导入到模拟考试与错题复盘
学习·考研·小程序·刷题·小程序推荐
2601_9653842614 小时前
口腔黏膜清洁的工程化路径:从表面形貌表征到清洁策略匹配
经验分享·笔记
泡泡鱼(敲代码中)14 小时前
Python 容器类型学习笔记:列表、元组、字典、集合
开发语言·笔记·python·pycharm
别动我齐刘海14 小时前
ROS2 Jazzy + C++ 实战路线——基础学习2
c++·人工智能·vscode·python·学习·机器学习·机器人
Hotchip_MEMS15 小时前
传统咪头与MEMS硅麦:雾化器气流传感方案对比
人工智能·笔记·物联网·电脑·制造