iOS静态库|仅链接使用过的符号

iOS静态库|仅链接使用过的符号,ios,objective-c,xcode,macos,Ios,Objective C,Xcode,Macos,我正在使用一些第三方iOS静态库,在保持二进制大小较小方面遇到了一些问题。我使用的库有一个Objective-C接口,该接口由本机C/C++代码支持。问题是库中的所有符号(用nm检查)在链接时都包含在我的应用程序中(即使我没有引用库中的任何代码)。这与我对静态库的理解相反,静态库只将应用程序(或其他链接库)引用的代码拉入应用程序 我做了很多工作,发现由于Objective-C的动态特性,链接只包含Objective-C类别方法的对象文件或静态库可能会产生一些特殊问题。因此,您可以将-ObjC标志

我正在使用一些第三方iOS静态库,在保持二进制大小较小方面遇到了一些问题。我使用的库有一个Objective-C接口,该接口由本机C/C++代码支持。问题是库中的所有符号(用nm检查)在链接时都包含在我的应用程序中(即使我没有引用库中的任何代码)。这与我对静态库的理解相反,静态库只将应用程序(或其他链接库)引用的代码拉入应用程序

我做了很多工作,发现由于Objective-C的动态特性,链接只包含Objective-C类别方法的对象文件或静态库可能会产生一些特殊问题。因此,您可以将-ObjC标志传递给链接器,让链接器拉入包含Objective-C类或类别的所有对象文件。这可以确保在运行时定义所有类和类别,但会使用未使用的Objective-C类/类别/方法定义来扩充应用程序的二进制文件

奇怪的是,我看到了添加-ObjC链接器标志而不在构建中的任何地方使用它的效果。所有Objective-C符号都包含在内,因此,Objective-C代码引用的所有本机C/C++符号,无论我的应用程序是否引用库中的任何代码。是否有其他人遇到过此问题或找到了解决方案


OSX10.11.4和Xcode 7.3

首先,免责声明:我个人没有尝试过我在这里描述的解决方案(我参与的所有项目都只是不加区别地使用了
-ObjC
标志),所以YMMV

也就是说,这可能有用:

基本上,我们的想法是,不用使用
-Objc
地毯炸弹,您可以在每个库的基础上进行稍微有针对性的加载:
-force\u load$(TARGET\u BUILD\u DIR)/lib.a

参考链接的作者特别提到CocoaPods是他遇到的一个特定问题的罪魁祸首,但我认为(希望)这个解决方案将适用于你所问的更一般的问题


至于为什么你甚至需要麻烦的问题,我能找到的唯一接近实际解释的东西可以在这里找到:。这篇文章描述了Unix(BSD)静态库和更动态的基于Objective-C的库(甚至是静态库)之间的“阻抗不匹配”,这些库包含例如类别。当前的链接器无法在编译/链接时为基本上在运行时绑定的方法建立所需的连接,因此这些链接器标志是解决该问题的一个方法。

不幸的是,这没有多大帮助。我所链接的所有静态库都有Objective-C符号,因此对于我的例子,--force负载将具有-ObjC的安全效果。还有其他建议吗?如果一个有问题的库是你自己的,你最好把它分成多个库,并且只在你需要的库中链接。如果这些是第三方库,那么不幸的是,我没有任何其他建议,我也不知道甚至可以用当前的链接器解决这个问题;运行时绑定的b/c,几乎是每个库的全有或全无命题。