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

How to manage transitive dependency for local Xcode projects

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

  1. Y ---> X

  2. Z ---> X

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

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

设置 1 和 2 独立运行效果很好。但是我正在为设置 3 苦苦挣扎,由于对它的传递依赖(目标 Y 和 Z 都依赖于它),它正在为目标 X 创建重复的构建规则,随后导致构建过程失败。

有人知道如何处理这种情况吗?提前致谢!

似乎在Objective-C中,我们不能link一个动态框架到另一个动态框架,或者到一个命令行工具。它总是引发异常,当 运行 在生产中

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

针对你的情况,我认为可能会解决你的问题

  • X (核心功能) 可以内置静态库
  • Y可内置动态框架类型
    • 将 link 使用 X 库
    • 或 link 与其他 (我的意思是另一个代码库)
  • Z (您的应用程序) 将 link 使用 Y 框架

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

要完成它,请执行以下步骤:

  1. 关闭所有相关并打开 Xcode 个项目。
  2. 从文件 > 新建 > 在根目录中创建一个新工作区 工作区。双击打开工作区,然后 drag/drop 将所需的项目添加到工作区。
  3. 将独立框架(我的问题中的 X)输出添加到两个 依赖项目目标(Y 和 Z),将其添加到 框架和库部分。只嵌入动态库 顶级应用程序 (Z),不要将其嵌入到 中间依赖目标库 (Y).
  4. 将中间框架(Y)添加到根级应用程序下 框架和库部分并将其嵌入根应用程序包。

这个设置对我来说就像一个魅力,没有创建重复的构建规则,它也自发地获得了依赖性。

显然,如果你的独立框架是一个静态库,你不能这样做,在这种情况下,它将链接到两个依赖目标,导致链接期间出现重复符号问题。