ios - 相互依赖的框架 Xcode

标签 ios objective-c xcode frameworks

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

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

这是归结的想法:

应用程序依赖项: A.framework B.framework C.framework D.framework

A.framework 依赖

B.框架依赖 A.框架

C.framework 依赖 A.framework B.framework

D.framework 依赖

更多信息:

目前,在C.framework中,我已经将A和B.frameworks拖到“Frameworks”文件夹中。我在别处读到这样做是为了将二进制文件与库链接。无论哪种方式,对于 A 和 B.framework 的 header 中的某些函数,我都会收到编译器错误:

ld: symbol(s) not found for architecture armv7

A 和 B 的build设置将“仅构建事件架构”设置为 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

最佳答案

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

库构建顺序的一种可能解决方案是将所有依赖库作为子项目添加到主项目中。如 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 似乎无需“目标依赖项”设置即可找出依赖项。该项目构建并运行。还没有达到从每个框架调用项目的程度。

Screenshot of a sample project

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

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

关于ios - 相互依赖的框架 Xcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39517318/

相关文章:

ios - 只想从 UIMenuController 复制和共享,但代码仍然不稳定

ios - 以同步顺序运行异步任务

ios - 具有双值的 TableView 单元格

ios - CAShapeLayer 描边看起来已重置

ios - XIB 文件和模拟器之间没有关联

ios - 为 UIView 设置动画

ios - 使用不同的模式,如 "Scale To Fill","Aspect Fit",""Aspect Fill"在 UITableViewCell 中处理 UIImageView

ios - 状态栏阻塞 UI

ios - xcode 7.2 无法构建 Objective-C 模块

ios - 重新格式化地标中的字符串结果