C++程序编译运行全过程

一、C++程序编译运行全过程

如下图,整个过程分为四个阶段:预处理、编译、汇编、链接。

C++程序编译运行过程图

预处理

该过程主要是根据预处理指令(#include、#define、#if等)重新组装c++代码,经过预处理阶段,将产生一个没有注释、没有include、没有define、没有条件编译(#if/#else)等指令的.i文件

编译

已经预处理的文件编译成汇编代码的过程,整个过程会包含语法,词法的分析,和一些优化操作。比如文件.i中包含字符串如main、if、while等,这些具体代表的意思还需要编译器经过词法分析、语法分析和语义分析,最后生成汇编代码。

汇编

汇编代码并不能直接被计算机识别,所以要想计算机理解我们的源代码,汇编指令还得翻译成机器指令,汇编指令只是机器指令的一种助记符(只是给机器指令命了名),它是用来帮助人们更好地理解机器指令而产生的,几乎每一条汇编指令对应一条机器指令。

汇编阶段通过汇编器把汇编代码翻译成目标文件,生成.obj或.o目标文件,该文件中存放的就是与源代码等效的机器指令,每一个.cpp文件都会对应生成一个.obj或.o文件。

链接

目标文件并不能直接执行,还需要经过链接过程,原因是:某个.cpp文件调用了另外.cpp文件中的函数或者常量等,它们是相互独立的(每个.cpp对应一个.obj文件),为了解决这类问题,必须要将调用者目标文件与被调用者的目标文件连接起来,最终得到可执行程序(.exe或.elf等)。链接一般分为静态链接和动态链接。

静态链接

将目标文件直接拷贝到可执行文件中的链接方式,该方式会将所有相关的目标文件都放入可执行文件,使用静态链接方式可以生成静态库文件(.lib或.a文件,本质上是若干目标文件的集合),其有如下特点:

静态库对函数库的链接是在编译时期完成的

程序在运行时与函数库再无瓜葛,移植方便

浪费空间和资源,因为和所需要函数相关的所有的库都会被打包进可执行文件

通常一个库文件是一个具有独立功能的且可以复用的若干个目标文件的集合

动态链接

在程序运行时动态加载目标文件的链接方式,该方式会将需要用的目标文件在运行才放入可执行文件,使用动态链接方式可以生成动态链接库(.dll或.so文件,本质上是若干个目标文件集合),其特点如下:

动态库只有一份,可以实现进程之间的资源共享(因此动态库也称为共享库)

对库函数的链接推迟到程序运行时

程序升级变得简单

可以在链接载入时完全由程序员在程序代码中控制

静态链接的缺点:

浪费空间,所有用到的目标文件都会拷贝进来

库更新以后需要重新编译:库是被复制到可执行文件中去了,如果某个库更新了,则与它相关的所有可执行文件都需要重新编译。

举报/反馈

© 版权声明
THE END
喜欢就支持一下吧
点赞15 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片