分布式应用的大小是否受使用静态库或动态框架作为依赖项的选择影响?我读过一篇较旧的文章,声称如果您使用静态库,Clang足够聪明,只链接应用程序使用的符号,但对于动态框架并非如此。这种情况仍然存在吗?编辑:澄清这是关于在App Store上分发的iOS应用程序。
如果您在连接某个库的静态构建 libfoo.a 和同一库的动态构建 libfoo.{dynlib|so} 之间有选择,那么链接静态库很可能会使您的可执行文件比链接动态库更大。静态链接的额外负担将根据以下因素而变化: - 可执行文件从库中需要的数据和代码的大小。 - 编译器及其编译选项的功能(Clang是编译器)。 - 链接器及其链接选项的功能(Clang不是链接器)。 - 可执行文件的后链接处理,例如剥离。但总体来说: 静态链接意味着必须从库中提取可执行文件引用并且由库提供的任何符号的定义,并物理地合并到可执行文件中。对于数据符号,定义是一些二进制数据。对于函数符号,定义是函数的二进制实现。动态链接仅意味着链接器将在可执行文件中包含一些简洁结构化信息,操作系统加载程序将在运行时解释该信息,以指令的形式将动态库从磁盘加载到程序的地址空间中,然后解析程序对库中定义的符号的引用。通常,如果在运行时从动态库提供,则无需将其合并到可执行文件中的定义的大小要比指令信息的大小大得多,该信息指示加载动态库。我们有动态库,以便具有功能和/或数据值的不同程序不需要物理复制它们。