相互依赖的框架Xcode

我正在研究一套(内部使用)框架,封装了我的开发过程的各个元素。 其中的一些框架是相互依赖的,但我想保持分离,以便更易于pipe理。 现在我遇到了各种编译器错误,我认为这些错误与依赖关系重叠。

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

这是简单的想法:

应用程序依赖关系: A.框架B.框架C.框架D.框架

A.框架依赖关系

B.框架依赖关系 A.框架

C.框架依赖关系 A.框架B.框架

D.框架依赖关系

更多信息:

目前,在C.framework中,我将A和B.frameworks拖入“Frameworks”文件夹。 我在别处读到这样做,而不是链接二进制与图书馆。 无论哪种方式,我得到一个编译器错误的一些function,在A和B.framework的头:

ld: symbol(s) not found for architecture armv7 

A&B的构build设置将“Build Active Architectures Only”设置为NO,并将有效体系结构设置为包含“armv7”。

B.框架,但没有问题的build设。

更新:

我现在可以通过在每个目标中链接二进制文件来获取应用程序,但是它立即崩溃,出现此错误:

 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 

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

图书馆build立订单的一个可能的解决scheme是将所有相关的库作为子项目添加到主项目中。 当所有项目都由同一个实体拥有和维护时,这是适当的,正如OP所提到的。

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

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

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

作为一个build议,还要把所有的框架都添加到“链接二进制库”中,在主项目下,所有这些框架都被使用了。

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

下面的图像显示了一个类似于OP中的设置的例子。 有一个FrameworkTest项目。 所有4个框架都被添加为“与库链接二进制文件”。 在它下面。 对于FrameworkBFrameworkA被添加到“Link Binary With Libraries”下。 类似于FrameworkC的工作stream程。 Xcode似乎找出依赖关系,而不需要“目标依赖”设置。 这个项目build立并运行。 没有从每个框架调用项目。

示例项目的屏幕截图

解决这个问题的另一个方法是使用一个工作空间来创build一个顶级项目,并将每个框架作为一个子项目来移动。 然后将每个框架添加到顶层项目的“embedded式框架”部分。

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

好吧,所以我似乎已经通过以下方式得到了这一点。

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

然后,我将每个框架添加到应用程序的“embedded框架”部分(并能够从“链接二进制..”和“目标相关性”部分删除它。

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

我不确定我是否明白为什么这个原理能够工作,但至less我可以继续前进!

感谢@ vel-genov的帮助!

确保这些设置是正确的:

  1. FRAMEWORK_SEARCH_PATHS(在生成设置中)
  2. 链接二进制与库(build立阶段)
  3. INSTALL_PATH(更改为所有框架的@rpath )(在构build阶段)
  4. @rpath (运行pathsearchpath)(添加@executable_path/../Frameworks为您的应用程序和所有需要embedded另一个框架的框架)(在生成设置)