【问题标题】:How to create a public static library which relies on a private static library in XCode?如何在 XCode 中创建一个依赖于私有静态库的公共静态库?
【发布时间】:2012-01-28 05:34:42
【问题描述】:

我的公司想为 iOS 开发提供两种不同的 SDK 以及使用每种 SDK 的示例应用程序。两个 SDK 都使用了许多不属于任何一个 SDK 的公共接口的通用代码。

我想对项目进行结构化,以便在一个静态库框架(我们保持私有)中拥有我们的公共代码,并且让每个 SDK 都是它自己的静态库框架(我们将发布)。每个 SDK 框架都依赖于通用框架。

我几乎已经完成了这个设置和工作,除了一件事......在 SDK 代码中使用的公共库中有一些父类。为了在 SDK 代码中发布子类,我需要将父类(仅在私有、通用框架中)的头文件与 SDK 框架一起导出。


关于如何解决此问题的任何建议?以下是最重要的优先事项:

  • 客户可以下载单个框架并让它正常工作
  • 我们不会在多个项目中重复代码

【问题讨论】:

  • 不完全确定您的问题是什么,是您不想发布父类的标头吗?
  • 不,我不介意那样做。问题是我无法让 XCode 将它们包含在 SDK 框架中。
  • 你有没有让这个工作?如果不为客户提供私有框架之一,他们将如何获得构建的公共框架之一?您是否将通用框架链接到公共框架的二进制文件?如果是这样,如果 SDK A 使用 CommonSDK 1.0 而 SDK B 使用 CommonSDK 1.1,该怎么办?将这两者链接到同一个应用程序时会遇到问题吗?

标签: iphone ios xcode xcode4 static-libraries


【解决方案1】:

拥有一个比其祖先具有更高可见性的类是一个棘手的问题。事实上,一些非常流行的语言和运行时禁止它(比如使用 .NET Framework 的语言)。

没有明显的解决方案。在我看来,最简单的方法是发布仅包含字段的私有类的标头。方法可以省略。这就是在 Apple 框架中隐藏“私有”方法的方式(这基本上会使类“公开”,但所有方法都将被隐藏)。

另一种解决方案是使用组合而不是继承来获取特性。让您的公共类继承自 NSObject,并为它们提供您的私有类的实例(使用 id 字段隐藏其类型)。

【讨论】:

  • 澄清一下...我不太担心暴露父类的标题;我更关心的是没有在通用框架中公开所有内容。
  • 不幸的是,我不知道如何配置 SDK 的 XCode 项目,以便它将我需要的头文件从通用框架复制到 SDK 的框架中。
  • @AndrewMiner,具体的设置是什么?您是发布带有一堆标题的.framework 对象还是.a 对象?我对static frameworks 感到困惑。
【解决方案2】:

您只需将这些通用头文件添加到两个框架中作为 Xcode 中的引用。 Xcode 项目文件可以引用该项目文件夹外部的文件。然后,您可以选择使用 Copy Header Files 构建阶段发布它们。

【讨论】:

    【解决方案3】:

    请看这篇我的博文。

    点击here

    这是创建静态库的完整参考。

    【讨论】:

    • 这是“完全”错误的。它解决了一个不同的问题,很糟糕。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-03
    • 1970-01-01
    • 2018-07-24
    • 2012-06-21
    相关资源
    最近更新 更多