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

cda*_*yor 5 clang app-store ios

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

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

Mik*_*han 3

libfoo.a如果您可以在链接某个库的静态构建和同一库的动态构建之间进行选择libfoo.{dynlib|so},则链接静态库很可能会使您的可执行文件比链接动态库更大。

静态联动产生的额外重量将根据以下因素而变化:-

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

但总的来说:-

静态链接要求可执行文件引用并由库提供的任何符号的定义必须从库中提取并物理合并到可执行文件中。对于数据符号,定义是一些二进制数据。对于函数符号,定义是函数的二进制实现。

动态链接仅需要链接器将一些简明的结构化信息合并到可执行文件中,操作系统加载程序将在运行时将这些信息解释为将动态库从磁盘加载到程序的地址空间中的指令,然后解析 程序对符号的引用是在库中定义的。

通常,如果在运行时从动态库提供定义,则不需要合并到可执行文件中的定义的大小指示加载器加载动态库的信息的大小大得多。

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

  • 我很欣赏这种洞察力。然而,我想在通过 App Store 分发的 iOS 应用程序的背景下专门询问这个问题。由于Apple不允许共享动态库(据我所知),因此我的理解是,您使用的任何动态库都必须嵌入到应用程序包中。在这种情况下,我很好奇如果使用静态库与动态库,最终的应用程序包大小是否有任何差异。如果不清楚,我很抱歉。 (2认同)