gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 01:03:23 24 4
gpt4 key购买 nike

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

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

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

OS X 10.11.4 和 Xcode 7.3。

最佳答案

首先,免责声明:我还没有亲自尝试过我在这里描述的解决方案(我参与过的所有项目都只是不加区别地使用 -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 的库(甚至是静态库)之间的“阻抗不匹配”,其中包含例如类别。当前链接器无法在编译/链接时为本质上在运行时绑定(bind)的方法建立所需的连接,因此这些链接器标志是解决该问题的方法。

关于iOS 静态库 |仅链接使用过的符号,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36729095/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com