【问题标题】:Building a distributable static library that uses cocoapods构建使用 cocoapods 的可分发静态库
【发布时间】:2014-04-04 00:59:09
【问题描述】:

我正在构建一个静态库以分发给其他 iOS 开发人员,但在配置链接器以允许在另一个应用程序中使用该静态库时遇到了一些问题。我使用this guide 创建了一个 MyStaticLibrary.framework 包,其中包含 lib 本身以及其他资产(例如图像)。这成功构建并使用 cocoapods 获取所需的依赖项(AFNetworking 等)。到目前为止,一切顺利。

但是当我将 MyStaticLibrary.framework 导入新的 Xcode 项目以测试使用该库构建应用程序时,我收到大量链接器错误(架构 i386 的未定义符号,_OBJC_CLASS_$_CLASSNAME),表明我做错了什么在这里。

所以我的问题是,如何使用来自 cocoapods 的依赖项构建 MyStaticLibrary.framework,以便我可以仅向第三方提供我的框架文件并允许他们访问公共标头中指定的所有功能?

【问题讨论】:

  • 检查你的项目的构建设置,在“框架搜索路径”下,它应该包括你的 .framework 所在的目录。如果没有这个设置,链接器将找不到你的静态二进制文件
  • @michaels 带有框架的目录包含在搜索路径中。这不是我遇到的问题,因为 Xcode 正在从我的框架中找到标头(即:它编译得很好,它只是在链接阶段失败)问题似乎是在构建框架时链接的任何文件在构建导入框架的测试应用程序时也需要链接。但是,这些文件不包含在框架中,我不知道如何包含它们。
  • 查找头文件和查找二进制文件是不同的事情,它们需要不同的构建设置。但我想我现在更好地理解了这个问题 - 您正在链接到未编译到您的二进制文件中的第三方库?
  • @michaels 没错,其中一些第三方库是通过 cocoapods 分发的。此外,其中一些 3rd 方库我有源文件,但其他库是它们自己的静态库。我想将所有这些编译到我的二进制文件中,但我不确定如何配置我的静态库目标来完成此操作。

标签: objective-c xcode static-libraries cocoapods


【解决方案1】:

默认情况下,您使用 CocoaPods 包含的任何库不会编译到您的框架中 - 它们是不属于您的实际产品的外部依赖项。但是,根据他们的常见问题解答,他们支持一种模式,您可以下载 pod 并且将它们链接到您的项目。从他们的常见问题解答中:

请注意,CocoaPods 本身不需要使用工作空间。如果 您更喜欢使用子项目,您可以通过运行 pod install 来实现 --no-integrate,这将在您认为合适的情况下将集成到您的项目中。

在编译的二进制文件中包含外部依赖项:

  • 对于代码:不要使用 cocoapods,而是检查您想要包含的存储库并将源文件复制到您的项目中——这将确保它们与您的其余代码一起编译

    李>
  • 对于静态库(即.a 文件),在框架的Link Binary With Libraries 构建阶段,请确保包含所有您想要编译的库。您还应该确保相关的头文件包含在 Copy Headers 构建阶段,并具有适当的可见性。

注意以这种方式捆绑第三方库时,您可能会与正在集成您的框架的项目发生冲突。例如,假设您正在使用一个名为 SOSomeView 的库,并且您选择在您的框架中编译它。现在,如果您正在集成的应用程序还包含SOSomeView,您将收到一个编译时错误,即该类被声明了两次。要解决此问题,您应该重新命名任何要硬编码到框架中的外部依赖项(即将类重命名为 XXSOSomeView)。

如果你用你的框架编译静态库,我不知道如何解决这个问题。

【讨论】:

  • 第一个要点是我非常熟悉的一种方法,因为我一直都在使用它。第二个我不太熟悉,但我能够使用OCMock 静态库创建一个工作的概念验证,所以肯定可以用这种方式完成
  • 有没有办法配置target,让cocoapods-sourced的依赖编译进框架?我不同意你的评估,即这违背了 cocoapods 的目的。强迫最终用户获取甚至对他们不可见的依赖项是没有意义的(而且它违反了框架的要求,其中之一是为最终用户提供一个简单的、自包含的库)将所有这些依赖项存储在框架的存储库中也是没有意义的。如果必须,我会将依赖项存储在 repo 中,但不希望。
  • 你说得对,CocoaPods 确实支持“简单”的用法,它会为你下载 pod,但将集成留给你。查看FAQ“CocoaPods 使用工作空间,这被认为是用户数据。为什么不使用普通的子项目?”
  • 我已选择此作为正确答案,但如果有人知道如何通过标准 cocoapods 工作区设置来完成此操作,我仍然会对如何配置它感兴趣。
  • 感谢您提及Link Binary With Libraries!我在其他任何地方都没有遇到过这个答案。 (这对我有帮助,即使我没有与 OP 相同的问题;我只是想创建一个包含 CocoaPods 的静态库)
猜你喜欢
  • 2013-06-10
  • 1970-01-01
  • 2014-02-10
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多