相互依赖的框架Xcode

时间:2016-09-15 17:47:48

标签: ios objective-c xcode frameworks

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

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

这是一个简单的想法:

应用依赖项 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拖入"框架"夹。我在别处读到了 Link Binary With Libraries。无论哪种方式,我都会在A和B.framework的标题中遇到一些编译器错误:

ld: symbol(s) not found for architecture armv7

A& 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

3 个答案:

答案 0 :(得分:1)

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

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

通过转到"构建阶段 - >将每个项目添加到主项目中。 Link Binary with Libraries。&#34 ;,然后使用" +"添加每个框架项目文件。按钮。然后转到每个子项目,并添加它的依赖项。

对于 B.framework 项目,请转到"将二进制文件链接到库。",并添加 A.framework 作为依赖项。

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

作为建议,还要将所有框架添加到" Link Binary With Libraries。",在主项目下,所有框架都会被使用。

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

下图显示了与OP中的设置类似的设置示例。有一个 FrameworkTest 项目。所有4个框架都添加为" Link Binary With Libraries。"在它下面。对于 FrameworkB FrameworkA 会添加到" Link Binary With Libraries。"。类似 FrameworkC 的工作流程。 Xcode似乎在不需要" Target Dependancies"设置。该项目建立并运行。 Haven没有调用每个框架中的项目。

Screenshot of a sample project

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

使用" Link Binary With Libraries。"每个框架子项目的一部分,用于定义其依赖关系。

答案 1 :(得分:0)

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

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

然后,我将每个框架添加到App的“嵌入框架”部分(并且能够从“Link Binary ..”和“Target Dependencies”部分中删除它。

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

我不确定我是否理解为什么这样有效,但至少我可以继续前进!

感谢@ vel-genov的帮助!

答案 2 :(得分:0)

确保这些设置正确无误:

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