【问题标题】:Interdependent frameworks Xcode相互依赖的框架 Xcode
【发布时间】:2016-09-15 17:47:48
【问题描述】:

我正在开发一组(仅供内部使用)框架,这些框架封装了我的开发过程中的各种元素。其中一些框架相互依赖,但我想将它们分开以便更易于管理。我现在遇到了各种编译器错误,我认为与依赖项重叠有关。

目前,所有这些框架和一个应用程序与不同的项目共享同一个工作区。在这种情况下,如何配置我的应用程序和框架以进行编译?

这是一个简单的想法:

应用依赖: A.framework B.framework C.framework D.framework

A.framework 依赖项

B.framework 依赖 A.framework

C.framework 依赖 A.framework B.framework

D.framework 依赖项

更多信息:

目前,在 C.framework 中,我已将 A 和 B.frameworks 拖到“Frameworks”文件夹中。我在别处阅读了 not Link Binary With Libraries。无论哪种方式,对于 A 和 B.framework 的标头中的某些函数,我都会收到编译器错误:

ld: symbol(s) not found for architecture armv7

A 和 B 的构建设置将“仅构建活动架构”设置为 NO,并将有效架构设置为包括“armv7”。

B.framework,但是构建没有问题。

更新:

我现在可以通过在每个目标中链接二进制文件来构建应用程序...但是它立即因此错误而崩溃:

dyld: Library not loaded: @rpath/A.framework/A
  Referenced from: /var/containers/Bundle/Application/94488FD7-B731-4E6B-86E6-3D2F09BB4E04/App.app/App
  Reason: image not found

【问题讨论】:

  • 用您遇到的示例错误更新您的问题。

标签: ios objective-c xcode frameworks


【解决方案1】:

最有可能导致此错误消息的问题与未按正确顺序构建的库有关。

构建库的顺序的一种可能解决方案是将所有依赖库作为子项目添加到主项目中。正如 OP 所述,当所有项目都由同一实体拥有和维护时,这是合适的。

通过转到“Build Phases -> Link Binary With Libraries.”将每个项目添加到主项目,然后使用“+”按钮添加每个框架项目文件。然后去每个子项目,添加它的依赖。

对于 B.framework 项目,转到“Link Binary With Libraries.”,并添加 A.framework 作为依赖项。

同样,对于 C.framework,添加 A.frameworkB.framework 作为依赖项。

作为建议,将所有框架也添加到“Link Binary With Libraries”中。在主项目下,所有框架都可以使用。

在这种情况下要注意的一件事是确保没有循环依赖,并且依赖不会在不同的项目中多次添加。

下图显示了与 OP 中的设置类似的示例。有一个 FrameworkTest 项目。所有 4 个框架都添加为“Link Binary With Libraries”。在它下面。对于 FrameworkBFrameworkA 被添加到“Link Binary With Libraries”下。 FrameworkC 的工作流程类似。 Xcode 似乎无需“目标依赖”设置就能找出依赖关系。该项目构建并运行。还没有从每个框架调用项目。

使用工作区的另一种解决方案是拥有一个顶级项目,并将每个框架作为子项目移动。然后将每个框架添加到顶级项目的“嵌入式框架”部分。

使用“将二进制文件与库链接”。每个框架子项目的部分,以定义其依赖项。

【讨论】:

  • 谢谢。不幸的是,它不允许我向“目标依赖项”部分添加任何内容。
  • 完成“将二进制文件与库链接”步骤后,新链接的库将显示在“目标依赖项”部分下。 “dyld:未加载库:@rpath/A.framework/A”错误消息可能是该特定库未​​构建的结果。
  • @olynoise,整理了一个示例项目。看看,让我知道这对你有什么作用。
  • 我似乎已经修复了它——感谢你的图片,这让我走上了正轨,因为我将每个框架都作为工作区中的“顶级”项目。将它们移动到 App 项目中允许我使用“嵌入框架”将项目带入.. 不确定到底发生了什么,但至少现在可以工作了!
  • 很高兴为您工作@olynoise。如果您不介意,我会将工作流程合并到我的答案中。感谢您的支持。
【解决方案2】:

好的,所以我似乎已经通过以下方式克服了这个问题。

我没有让我的工作区将每个框架都作为一个单独的“顶级”项目,而是将框架项目移动到 App 项目的子项目中。

然后,我将每个框架添加到应用程序的“嵌入框架”部分(并且能够将其从“链接二进制文件..”和“目标依赖项”部分中删除。

在每个框架中,我使用“链接二进制...”部分来包含相关框架。

我不确定我是否完全理解它为什么起作用,但至少我可以继续前进!

感谢@vel-genov 的帮助!

【讨论】:

  • 如果这是对您有用的最终解决方案,请接受您自己的答案,以便其他人清楚这解决了它。
【解决方案3】:

确保这些设置正确:

  1. FRAMEWORK_SEARCH_PATHS(在构建设置中)
  2. 将二进制文件与库链接(在构建阶段)
  3. INSTALL_PATH(所有框架更改为@rpath)(在构建阶段)
  4. @rpath(运行路径搜索路径)(为您的应用和所有需要嵌入另一个框架的框架添加 @executable_path/../Frameworks)(在构建设置中)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    • 2019-03-14
    • 1970-01-01
    相关资源
    最近更新 更多