十六、关于库和dyld的概念

本文由快学吧个人写作,以任何形式转载请表明原文出处

本文仅介绍库和dyld的一些概念性内容,方便以后的一些dyld加载动态库的内容做铺垫。

一、代码的编译流程

源文件 ---> 预编译 ---> 编译 ---> 汇编 ---> 链接 ---> 可执行文件

这个流程和下面的解释要刻在骨子里。

(1). 源文件 : 例如OC中的.h.m文件。C++里面的.cpp文件,这种我们写代码的文件叫源文件。

(2). 预编译 : 也叫预处理,是编译之前的处理工作。做的事情是:注释被删除、头文件被展开、宏被替换、条件编译被处理。

(3). 编译 : 对你写的代码进行词法分析、语法分析、语义分析,并且进行适当的优化。生成.s为后缀的汇编代码文件。

(4). 汇编 : 将编译生成的.s后缀的汇编文件转换成机器可以执行的机器指令,生成.o后缀文件,也就是生成机器指令文件。

(5). 链接 : 将所有的机器指令文件,也就是.o后缀文件,以及需要使用的第三方库通过链接器关联在一起,并生成可执行文件(mach-o格式)。

二、什么是库

1. 库的理解 :

库是一份可执行代码的二进制。可以被操作系统载入内存,并且被识别。
在链接阶段,会将汇编生成的目标文件(.s文件)与引用的库一起链接,打包生成到可执行文件中。

2. 库的常见分类

1. 静态库 : 例如以.a.lib为后缀的库。

静态库在链接的时候,会被完整的复制到可执行文件中,当静态库被多次使用时,就会多次复制到内存中,会出现拷贝冗余,造成内存浪费。

2. 动态库 : 例如以.framework.so(安卓的动态库文件格式)、.dll为后缀的库。

动态库在链接的时候,不会直接在被调用处进行复制和被调用,而是在程序运行时才被载入到内存中,以供使用。

3. 静态库和动态库的解析示意图

1. 静态库 :

如图所示,假设代码段1和代码段2是同一个项目中的两段代码,并且1和2分处在不同的模块下,但是同时都需要引用静态库中的文件B和文件D。

因为是静态库,所以在1使用的时候,需要将静态库复制到内存中,再调用B和D。在2使用的时候,又将静态库复制到内存中,再调用B和D。

2. 动态库

如图所示,假设代码段1和代码段2是同一个项目中的两端代码,并且1和2分处在不同的模块下,但是同时都需要引用动态库中的文件B和文件D。

因为是动态库,所以系统会在1使用的时候,将动态库加载到内存中,再调用B和D。在2使用的时候,则不会再进行一次动态库的加载,因为在1调用动态库的时候已经加载了动态库到内存,所以2就会直接使用已经加载到内存中的动态库中的B和D。

4. 动态库和静态库的优缺点

  1. 静态库:

优点 : 不受外部环境的影响。比如删除了静态库,对可执行文件不会造成影响,因为静态库在链接时就已经打包到可执行文件中了。

缺点 : 浪费内存空间。如果静态库进行了修改,可执行文件也需要重新编译生成。

  1. 动态库:

优点 : 只加载到内存中一次,内存共享,节约内存空间。

缺点 : 运行时载入会造成性能损失,而且可执行文件依赖外部环境,一旦动态库进行了修改,但是出现了错误,则会导致程序出现问题。

三、什么是dyld

英文全称 : the dynamic link editor

中文全称 : 苹果动态链接器

dyld是苹果操作系统的非常重要的组成部分。在app被打包生成可执行文件mach-o之后,dyld会对可执行文件进行链接各种库和加载主程序。

如下图所示 :

相关推荐
OKXLIN4 小时前
IOS UITextField 无法隐藏键盘问题
ios·objective-c
AL.千灯学长11 小时前
DeepSeek接入Siri(已升级支持苹果手表)完整版硅基流动DeepSeek-R1部署
人工智能·gpt·ios·ai·苹果vision pro
openinstall全渠道统计1 天前
免填邀请码工具:赋能六大核心场景,重构App增长新模型
android·ios·harmonyos
早起的年轻人1 天前
Flutter CupertinoNavigationBar iOS 风格导航栏的组件
flutter·ios
貂蝉空大2 天前
uni-app开发安卓和ios app 真机调试
android·ios·uni-app
胖虎12 天前
iOS 中的圆角与平滑圆角:从新特性到老项目适配
ios·圆角·平滑圆角·cornercurve
志飞2 天前
ios UICollectionView使用自定义UICollectionViewCell
ios·collectionview·自定义cell
Neo Evolution2 天前
Flutter与移动开发的未来:谷歌的技术愿景与实现路径
android·人工智能·学习·ios·前端框架·webview·着色器
哈里哈气2 天前
某手sig3-ios算法 Chomper黑盒调用
objective-c·ios逆向·frida·chomper
没头脑的ht3 天前
ios App的启动过程和启动优化
ios