【问题标题】:iOS Static Library | Linking only USED symbolsiOS 静态库 |仅链接 USED 符号
【发布时间】:2016-04-19 20:45:08
【问题描述】:

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

我已经完成了一堆reading 并发现由于Objective-C 的动态特性,链接目标文件或仅包含Objective-C 类别方法的静态库可能会出现特定问题。因此,您可以将 -ObjC 标志传递给链接器,以让链接器拉入所有包含 Objective-C 类或类别的目标文件。这确保了所有类和类别都在运行时定义,但会使用未使用的 Objective-C 类/类别/方法定义使您的应用程序的二进制文件膨胀。

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

OS X 10.11.4 和 Xcode 7.3。

【问题讨论】:

    标签: ios objective-c xcode macos


    【解决方案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。这篇文章描述了 Unix (BSD) 静态库和更动态的基于 Objective-C 的库(甚至是静态库)之间的“阻抗不匹配”,例如类别。当前链接器无法在编译/链接时为本质上在运行时绑定的方法建立所需的连接,因此这些链接器标志是解决该问题的方法。

    【讨论】:

    • 不幸的是,这并没有多大帮助。我链接的所有静态库都有 Objective-C 符号,所以 --force-load 对于我的情况将具有 -ObjC 的安全效果。还有其他建议吗?
    • 如果有问题的库是您自己的,最好的办法是将其分解为多个库,并且只链接您需要的库。如果这些是第三方库,那么不幸的是我没有任何其他建议,我也不知道用当前的链接器甚至可以解决这个问题;运行时绑定的 b/c,对于每个库来说,这几乎是一个全有或全无的命题。
    猜你喜欢
    • 1970-01-01
    • 2016-01-19
    • 2015-04-05
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    相关资源
    最近更新 更多