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

相关推荐
googleccsdn1 小时前
ENSP Pro Lab笔记:配置BGP EVPN VXLAN双栈(1)
网络·笔记
admin838374841_2 小时前
部署若依分离版本
笔记
朔北之忘 Clancy2 小时前
2025 年 6 月青少年软编等考 C 语言一级真题解析
c语言·开发语言·c++·学习·算法·青少年编程·题解
墨&白.2 小时前
机器学习速成笔记week9:决策树ID3、C4.5和CART的底层逻辑
笔记·决策树·机器学习
叫我:松哥2 小时前
基于 Flask 框架开发的在线学习平台,集成人工智能技术,提供分类练习、随机练习、智能推荐等多种学习模式
人工智能·后端·python·学习·信息可视化·flask·推荐算法
lally.2 小时前
传统漏洞的演变
笔记·安全架构
东心十2 小时前
AI学习环境安装
人工智能·学习
Hooray112 小时前
入门_本地项目上传到GitCode上面
学习·gitcode
名字不相符2 小时前
NSSCTF2026年1月8日每日一练之[第五空间 2021]WebFTP
学习·萌新
四谎真好看2 小时前
JavaWeb 学习笔记(Day02)之Vue
笔记·学习·vue·学习笔记·javaweb