我正在使用一些第三方iOS静态库,但在保持二进制文件大小方面遇到了一些麻烦。我使用的库有一个Objective-C接口,由本机C / C ++代码支持。问题是库中的所有符号(用 nm 检查)在链接时都包含在我的应用程序中(即使我没有引用库中的任何代码)。这与我对静态库的理解相反,在静态库中,只有应用程序(或其他链接库)引用的代码被引入您的应用程序。
我做了很多reading并且发现由于Objective-C的动态特性,链接目标文件或仅包含Objective-C类别方法的静态库可能会产生特定问题。因此,您可以将 -ObjC 标志传递给链接器,以使链接器引入包含Objective-C类或类别的所有目标文件。这可以确保所有类和类别都在运行时定义,但是使用未使用的Objective-C类/类别/方法定义来扩展App的二进制文件。
奇怪的是,我看到添加 -ObjC 链接器标志的效果,而不是在我的构建中的任何地方使用它。所有Objective-C符号都包含在内,因此,Objective-C代码引用的所有本机C / C ++符号,无论我的App是否引用了库中的任何代码。有没有其他人遇到过这个问题或找到了解决方案?
OS X 10.11.4和Xcode 7.3。
答案 0 :(得分:1)
首先,免责声明:我个人没有尝试过我在这里描述的解决方案(我所做的所有项目都只是不加区分地使用-ObjC
标志),所以YMMV。
那说,这可能有用:https://github.com/CocoaPods/CocoaPods/issues/712
基本上,我们的想法是,不是使用-Objc
地毯炸弹,而是可以在每个库的基础上进行稍微更有针对性的加载:-force_load $(TARGET_BUILD_DIR)/lib<yourLibName>.a
。
引用链接的作者特别提到CocoaPods是他遇到的特定问题的罪魁祸首,但我认为(希望)这个解决方案适用于您提出的更普遍的问题。
关于为什么的问题,你甚至不得不打扰,我能找到的唯一能够找到实际解释的东西可以在这里找到:https://developer.apple.com/library/mac/qa/qa1490/_index.html。这篇文章描述了一个&#34;阻抗不匹配&#34;在Unix(BSD)静态库和更动态的基于Objective-C的库(甚至是静态库)之间,包含例如类别。对于在运行时基本上绑定的方法,当前链接器无法在编译/链接时建立所需的连接,因此这些链接器标志是解决该问题的方法。