当前位置: 首页 > news >正文

如何衡量用静态库还是动态库?

这是面试时候碰到的一个问题,当时问的脑子糊糊的........

动态库和静态库的定义

Library是计算机程序使用的非易失性资源集合,包含源代码。iOS、macOS上大部分library都会包含源码,支持一种或多种架构。Library可以被静态链接,称为静态库(static library);也可以被动态链接,称为动态库(dynamic library)。

静态库命名格式通常为lib*.a,动态库命名格式为*.dylib

静态库

• 编译时直接链接到可执行文件,最终的 .ipa 包会包含整个库文件。

• 代码和资源一起打包进 APP,不需要额外加载,运行时不依赖外部库。

动态库(对于动态库,如果是官方的库文件,比如UIKit,SwiftUI等等,ios只会在app中共用一份,全部app都通过动态链接查找,但对于第三方库,由于ios的沙盒机制,所以即使是一样的库,也不能在应用程序之间共享):

• 不直接编译到可执行文件

·ipa打包出来属于单独的模块,在运行时加载

两种链接方式:静态链接和动态链接

静态链接发生在创建App的时候,构建时,静态链接器从库中找API,复制进二进制执行文件中,会影响App的大小

动态链接发生在App启动时候,静态链接器把库运行路径记录在App中,启动时从动态库中去查找,会影响App的启动时间(启动不再只是加载一个程序文件,动态库也需要加载并连接到一起) 

下面从可执行文件大小、对app启动的影响、安全性、独立部署四个方面对比动态库、静态库。

可执行文件大小

  • 静态库的可执行文件大。使用静态库时,链接器会将静态库代码拷贝到可执行文件中,静态库成为可执行文件的一部分。
  • 动态库的可执行文件小。在启动时或运行时,将动态库代码加载到内存,动态库不会成为可执行文件的一部分,因此,使用动态库的可执行文件较小。

启动耗时

  • 静态链接启动速度快。所有符号都在同一个模块内,没有符号绑定的耗时,启动速度快。但二进制文件太大,启动时占用内存也会多,太多的page fault也会增加启动耗时。
  • 动态链接启动慢,尤其在iOS中。Apple在WWDC中推荐iOS app最多使用六个动态库,macOS没有说明。这一推荐值随硬件性能变化而变。

安全性(运行时是否会查找不到符号)

  • 静态链接是安全的。因为编译时会将静态库符号拷贝到可执行文件中,不会出现查找不到符号。
  • 有风险。尽管编译器会进行验证,但可能由于开发忘记嵌入而导致Library not loaded ... Reason: image not found。macOS中app之间可以共享动态库,可能因为动态库版本差异导致找不到符号。

独立部署

  • 静态库不支持独立部署。所有内容都在一个二进制文件中提供,无法仅部署部分依赖。
  • 动态库:
    • iOS禁止部署单独库、框架。
    • 如果模块安装到了共享位置,macOS支持部署单独的库、框架。

总上所述说:动态库对Build影响小,但启动的时候的时候需要加载,会使启动时间变慢(ios有启动缓存机制,即这次启动会缓存动态链接的过程)。静态库太多,二进制文件就会很大,迭代构建/调试周期就会变慢。

对于动态链接的优化,我们还有使用可合并库来进行优化,具体可以看认识可合并库 - WWDC23 - 视频 - Apple Developer

参考:Link fast: Improve build and launch times - WWDC22 - Videos - Apple Developer

https://github.com/pro648/tips/blob/master/sources/%E9%9D%99%E6%80%81%E5%BA%93%E5%92%8C%E5%8A%A8%E6%80%81%E5%BA%93%E5%AF%B9%E6%AF%94.md

相关文章:

  • LoRA技术全解析:如何用4%参数量实现大模型高效微调
  • 恐惧与贪婪指数数据获取及可视化
  • Canvas实现旋转太极八卦图
  • AI提示词编写方法全解析
  • DevExpress 在NetCore 中添加DevExpress 里的dll 出现面向无法动态枚举工具箱。。。
  • 第十三届蓝桥杯大赛软件赛省赛C/C++ 大学 B 组 统计子矩阵
  • python黑科技:无痛修改第三方库源码
  • NSSCTF(MISC)—[justCTF 2020]pdf
  • 【服务器进程管理与多脚本运行指南】关于服务器上 kill 进程 同时运行多个 python 文件的指令】
  • Nginx — Nginx安装证书模块(配置HTTPS和TCPS)
  • J2EE框架技术 第九章 Spring缓存技术
  • C语言pthread库创建线程的案例
  • 前端程序员学习Python的极简入门
  • (undone) MIT6.824 Lecture 02 - RPC and Threads
  • Stable Diffusion LoRA模型训练:图片收集与处理完全攻略
  • 单节点的 OpenStack 一体化部署
  • CentOS8+Nginx环境使用Certbot+Let‘s Encrypt 配置免费ssl证书及自动续期
  • Windows Server2019搭建FTP服务器
  • iOS审核被拒:Missing privacy manifest 第三方库添加隐私声明文件
  • 5G_WiFi_CE_标称带宽/占用带宽