链接后是否所有静态库都包含在最终产品中?

时间:2015-09-16 16:14:35

标签: objective-c linker

假设我创建了一个iOS应用程序。我包括一个静态库。我创建了一个在静态库中定义和实现的类的对象。该对象不使用库中定义的其他类。我构建的应用程序中是否存在所有静态库?我们的想法是,许多静态库包含未使用的代码,并且不需要存在。

我相信有一些标志可以帮助确定行为 - 如果有人能说明这是如何运作的,我当然会很感激。

1 个答案:

答案 0 :(得分:1)

静态库是目标文件的存档。如果您链接到静态库libfoo.a那么 默认情况下,链接器将链接到您的最终可执行文件,并且只链接到libfoo.a中的那些目标文件 需要提供程序引用的公共符号的定义。

更具体地说,如果链接器在给定的位置找到所请求的库(通过选项-lfoo) 指向要链接的目标文件和库的命令行序列,然后它将 从存档中提取并链接到可执行文件中提供的存档中的每个目标文件 任何符号的定义,直到链接中的那一点仍未定义。

这样,未使用的公共符号的定义可以冗余地链接到 你的程序,但只有在目标文件中找到它们(无论是独立的还是成员的 一个不完全多余的图书馆。

如果你不想容忍那些潜在的裁员,那么就结合了 编译器和链接器选项可以消除它们:请参阅this answer