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文件实现运行逻辑。

相关推荐
碎光拾影33 分钟前
CPU与MCU核心区别揭秘
单片机·学习·51单片机
栈溢出了2 小时前
Redis 分片集群与哈希槽笔记
java·redis·笔记·spring
我命由我123452 小时前
复利极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
AOwhisky3 小时前
Python 学习笔记(第三期)——流程控制核心知识点自测与详解
开发语言·笔记·python·学习·云原生·运维开发·流程控制
tyqtyq223 小时前
药品说明书解读 —— AI 安全用药助手,鸿蒙原生应用深度解析
人工智能·学习·华为·生活·harmonyos
小心亦新4 小时前
STM32学习13 定时器1中断
stm32·嵌入式硬件·学习
我命由我123454 小时前
72 法则极简理解
经验分享·笔记·学习·职场和发展·求职招聘·职场发展·学习方法
qq_263_tohua5 小时前
第112期 CNN学习,不错的文章
学习
我想我不够好。5 小时前
满级的惩戒在范围
学习
LiaoWL1235 小时前
【SpringCloud合集-04】Sentinel 流量控制与熔断降级 学习笔记
学习·spring cloud·sentinel