分布式应用程序大小是否受到使用静态库或动态框架依赖的选择的影响?我读了一篇较早的文章,声称Clang非常聪明,如果使用静态库,只能链接应用程序使用的符号,但动态框架不是这种情况。这仍然是这样吗?
编辑:澄清这是关于在App Store上分发的iOS应用程序
如果您可以选择链接某个库的静态构建,libfoo.a
和相同库的动态构建,libfoo.{dynlib|so}
,链接静态库很可能会使您的可执行文件比链接动态库更大。
静态连接的额外重量将取决于: -
但总的来说: -
静态链接要求必须从库中提取可执行文件引用并由库提供的任何符号的定义,并将其物理合并到可执行文件中。对于数据符号,定义是一些二进制数据。对于函数符号,定义是函数的二进制实现。
动态链接只需要链接器在可执行文件中包含一些简洁结构化的信息,OS加载程序将在运行时将其解释为将动态库从光盘加载到程序的地址空间,然后解析程序对符号的引用。在库中定义。
通常,如果在运行时从动态库提供的定义不需要包含在可执行文件中的定义的大小远远大于指示加载器加载动态库的信息的大小。
我们有动态库,因此具有共同功能和/或数据值的各种程序不需要物理地合并它的副本。