【问题标题】:iOS Library/Framework, how to exclude specific classes from the build product?iOS 库/框架,如何从构建产品中排除特定类?
【发布时间】:2023-03-09 09:50:01
【问题描述】:

我正在尝试构建一个 iOS 库/框架,为了简单起见,我们会说将一些类 A 暴露给使用它的项目。现在的问题是A 类依赖于B 类,这并不意味着在库的构建输出中公开(甚至作为符号包含)。这会导致问题,因为其中有另一个类 C 的库也恰好依赖于类 B

如果我试图在一个项目中包含这两个库,链接器会抱怨有多个类 B 的定义。

解决此问题的最佳方法是什么?在构建两个库(或至少两个库之一)时,是否可以将类 B 设置为弱链接,如果可以,如何?

或者应该将 B 类提取到它自己的库/框架中,然后修改两个库以引用它,而不是将 B 类作为源文件包含在内?

【问题讨论】:

    标签: ios xcode linker


    【解决方案1】:

    我认为最好的方法是在您的项目中制作多个目标。最简单的方法是在 XCode 左侧的文件列表中单击您的项目文件,右键单击中间窗格中“TARGETS”下的对象并选择复制。然后,您可以在一个目标中包含 A 和 C,在另一个目标中包含 B 和 C。您可以单独编译它们,这基本上就像拥有两个项目,只是它们共享公共文件。这听起来像你想要的吗?

    编辑再想一想,听起来不像。当您编译到一个库,然后将另一个项目链接到它时,您的问题就会发生,对吧?

    似乎没有办法在已编译的库中拥有弱链接对象。您可能最好将它们拆分为单独的库(这与this page 底部描述的场景中发生的情况类似)

    【讨论】:

    • 是的,页面上讨论的问题正是我遇到的问题。我有一个在内部使用SBJson 的第三方库(通过将SBJson 源集成到库项目/代码中),以及一个执行相同操作的内部库。尝试在第三个项目中链接它们会导致两个 SBJson 实例之间发生冲突。
    • 有第三方库的源码吗?
    • 在这种情况下是的,当然,鉴于SBJson 的受欢迎程度,情况可能并非总是如此。因此,如果碰巧有一个不需要自己修改库项目的通用解决方案来解决这个问题,我肯定有兴趣了解它。
    • 好吧,当你没有源代码时,解决方案很棘手......如果你有两个编译的库构建了相同的符号,我认为没有办法做到这一点如果您只有一个的源代码,您可以包含已编译的源代码并从项目中删除基础库,因为知道它将包含在已编译的库中。当然,如果你有这两者的来源,那么解决方案很简单。
    猜你喜欢
    • 2018-11-09
    • 2013-08-11
    • 1970-01-01
    • 2015-02-06
    • 2019-01-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-07
    相关资源
    最近更新 更多