如何管理本地Xcode项目的传递依赖项

时间:2019-11-15 00:10:18

标签: ios objective-c xcode dependency-management xcode11

我有两个Objective C动态框架X和Y,以及另一个Objective C应用Z。 所有这些框架和应用程序都是我在本地创建的。框架X是框架Y和应用Z使用的非常基本的框架。因此,依赖关系图如下所示:

  1. Y ---> X

  2. Z ---> X

  3. Z ---> Y(---> X)

我希望所有目标都是可调试的,并根据运行目标(设备/模拟器)选择平台工具。因此,我将依赖项作为子项目添加到了主项目中,并将它们与依赖项链接起来,以通过Xcode生成隐式依赖项。

设置1和2独立工作。但是我在设置3中苦苦挣扎,它由于对目标X的传递依赖(目标Y和Z都依赖于它)而为目标X创建重复的构建规则,并且随后使构建过程失败。

有人对如何处理这种情况有任何想法吗?预先感谢!

2 个答案:

答案 0 :(得分:1)

似乎在Objective-C中,我们无法将动态框架链接到另一个动态框架或命令行工具。在生产环境中运行时,总是会引发异常。

Dyld Error Message:
  Library not loaded: @rpath/XFrameworks.framework/Versions/A/XFrameworks

针对您的情况,我认为可以解决您的问题的

  • X (核心功能)可以在静态库中构建
  • 可以在动态框架类型中构建
  • Y
    • 将与X库链接
    • 或与其他人链接(我的意思是另一个代码库)
  • Z (您的应用程序)将与Y框架
  • 链接

答案 1 :(得分:1)

实际上,有一种方法可以最终解决Xcode中的传递依赖问题。我必须使用Workspace(.xcworkspace),而不是Xcode项目(.xcodeproj)。

要完成此操作,请执行以下步骤:

  1. 关闭所有相关的并打开Xcode项目。
  2. 从“文件”>“新建”>“根目录”中创建一个新的工作区。 工作区。双击打开工作区,然后 将所需的项目拖放到工作区中。
  3. 将独立框架(我的问题是X)的输出添加到 通过将相关项目目标(Y和Z)添加到 框架和库部分。仅将动态库嵌入到 顶级应用(Z),请勿将其嵌入到 中间依赖目标库(Y)。
  4. 将中间框架(Y)添加到根目录应用程序下 框架和库”部分,并将其嵌入到根应用程序捆绑包中。

此设置对我来说就像是一种魅力,而无需创建重复的构建规则,它也自发地获取了依赖项。

很明显,如果您的独立框架是静态库,则无法执行此操作,在这种情况下,它将被链接到两个从属目标,从而导致链接期间出现重复符号。