iOS App包含静态库中的所有符号

时间:2016-04-19 13:54:22

标签: ios objective-c static

我遇到一个问题,我无法解决关于将iOS App与一个或多个静态库链接的问题。这是问题所在:

我正在创建几个静态库(MACH-O类型:可重定位目标文件),每个静态库都包含大量符号。每个静态库都是FAT库,包含每个iOS / Simulator体系结构的切片。根据我的理解,当我编译我的iOS应用程序时,我的应用程序使用的符号应该编译到我的应用程序中并包含在我的应用程序中,但是,所有符号都包含在内。

我已经使用 otool nm 和其他工具完成了一些测试,可以看到当我链接到这些库中的任何一个时,即使我不知道#39; t调用库中的任何代码,所有符号都被编译到App中。这需要我的应用程序从42kB一直到3 + MB。

关于为什么会发生这种情况的任何想法?

2 个答案:

答案 0 :(得分:0)

Objective-C是一个动态运行时;这是允许的,例如执行:

NSString *classToUse = ["MPViewController" stringByAppendingString:class];
return [[NSClassFromString(classToUse) alloc] init];

...此外,这或多或少正是在加载NIB时发生的情况 - 字符串类和属性名称是从磁盘加载的,然后通过键值编码应用的运行时和属性找到支持类。因此,动态查找不是边缘情况。

因此,链接器不能对Objective-C静态库中使用哪些符号做出任何假设,这与一个C链接器。

答案 1 :(得分:0)

是的,可以通过剥离静态库来完成,但是如果启用了后处理。将Xcode构建设置“Deployment Postprocessing”设置为yes。 (DEPLOYMENT_POSTPROCESSING = YES)。还要确保“使用单独的条带”设置为“是”。您可以查看this

您还可以使用动态库实现您的期望,有一篇非常好的文章here

额外提示 *创建库时,在构建设置中将Debug Symbols设置为NO。这可以将静态库的大小减少多达30%。