C++ 编译过程

源码 ——> 预处理器 .i 文件——> 编译器 .s 文件 ——> 汇编器 .o 文件 ——> 链接器 ——> 执行程序 

预处理器:读取代码里 #开头的命令 ,并把他插入到程序文本里,生产已.i 为后缀名的文件

编译器:把.i  文件 生成汇编文件  .s

汇编器:把汇编文件 生成 二进制 文件 .a 

链接器:链接其他的二进制 文件 生成 最终 执行程序

 

静态链接 和 动态链接

1.静态链接(在装载之前,完成所有符号的引用)
静态链接:链接器在链接阶段将各种库文件和相关文件集成到可执行文件中,在windows下静态链接库以.lib结尾,linux下以.a结尾

步骤:1,空间与地址的分配,扫描所有的目标文件,合并相似段,收集当中所有的符号信息,

2,符号解析与重定位,调整代码位置

优点:程序发布时无需带库,可以独立执行

缺点:1,浪费内存空间,多进程操作系统下,内存中可能会存在多个相同的库

2,程序开发受限,有一个模块更新,要重新编译打包整个代码

2.动态链接(在运行时才进行符号重定位)
动态链接:动态链接是把链接过程在运行时进行,动态链接在可执行文件装载或运行的时候,由操作系统的装载程序加载库文件,windows下以.dll结尾,也有.lib的,但是这个是叫做导入库,和静态链接的不一样,linux下以.so结尾。。

步骤:编译时通过记录一系列符号与参数,在程序运行或加载时将这些信息传给操作系统,操作系统将需要的动态库加载到内存中去,然后再程序运行到指定的代码时,去共享执行内存中已经加载的动

posted @   joker_2255  阅读(10)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 【.NET】调用本地 Deepseek 模型
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
点击右上角即可分享
微信分享提示