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

相关推荐
by209999 小时前
学会使用std::string类,并理解其内部是如何管理字符串的详细阐述(上)
c++·笔记·字符串·类和对象·string
青柠之夏cc10 小时前
AI与教育:个性化学习助手让“因材施教“成为现实,但代价是隐私?
人工智能·学习
笑鸿的学习笔记10 小时前
C++笔记之大块顺序写
java·c++·笔记
for_ever_love__10 小时前
机器学习入门——手写线性回归与梯度下降
人工智能·python·学习·机器学习·线性回归
在猴站学算法10 小时前
(SQL注入学习)无回显的报错注入(Error-Based)
学习·网络安全·sql注入·ctf竞赛
山岚的运维笔记12 小时前
ComfyUI NVIDIA安装教程:官方便携版下载+run_nvidia_gpu.bat启动,8G显存Windows实操
运维·服务器·windows·笔记·prompt·aigc·comfyui
知识分享小能手12 小时前
C++ 学习教程,从入门到精通,C++ 友元、异常和其他特性 — 详细知识点(15)
开发语言·c++·学习
fanged13 小时前
Camera学习2(V4L2和Media Controller)(TODO)
学习
知潮网14 小时前
手机号注销两年,免密扣款仍在继续
笔记
努力学习的代码小白15 小时前
源码学习15
学习