静态库与动态框架的iOS应用大小

时间:2018-07-25 17:04:52

标签: ios app-store clang

选择使用静态库或动态框架进行依赖是否会影响分布式应用程序的大小?我读了一篇较旧的文章,声称Clang足够聪明,仅在使用静态库时才链接应用程序使用的符号,但对于动态框架则不是这样。还是这样吗?

编辑:澄清这与在App Store上分发的iOS应用有关

1 个答案:

答案 0 :(得分:2)

如果您可以选择链接某个库的静态内部版本libfoo.a, 以及同一库libfoo.{dynlib|so}的动态版本,将 静态库很可能会使您的可执行文件比链接 动态库。

静态链接的额外权重将取决于:-

  • 可执行文件需要从库中获取的数据和代码的大小。
  • 编译器的功能和编译选项。 (C语是编译器。)
  • 链接器的功能和链接选项。 (C不是链接器。)
  • 可执行文件的可能的后链接处理,例如剥离。

但总的来说:-

静态链接需要定义以下任何符号: 必须提取库提供的可执行参考文件 从库中并物理地合并到可执行文件中。对于数据 符号,定义是一些二进制数据。对于功能 符号,定义是函数的二进制实现。

动态链接仅要求链接器将某些内容简洁地合并到可执行文件中 OS加载程序将在运行时解释为指令的结构化信息 将动态库从光盘加载到程序的地址空间,然后然后 将程序的引用解析为库中定义的符号。

通常,不需要不需要的定义的大小将包含在可执行文件中 如果它们是在运行时从动态库提供的,则比 指示加载程序加载动态库的信息。

我们拥有动态库,因此具有功能和/或功能的各种程序 共同的数据值不需要物理上合并它的副本。