我刚刚运行了一些快速测试,它似乎是自动发生的。这就是我所做的:
- 我使用 DerivedData 文件夹作为所有 3 个项目的默认构建位置(这是我使用的 XCode 4.2 中的默认设置)
- 我将 Public Headers 文件夹路径 更改为 include/ProjectX,其中 X 是静态库的名称。我只为静态库 A 和 B 执行此步骤,而不是为实际链接它们的项目执行此步骤。这一步是为了能够导入
<LibX/Header.h>之类的标头。
- 我使库 B 直接依赖于库 A,并将 A 链接到 B
- 我将库A直接依赖于主项目并将主项目链接到A
在这个基本设置之后,我使用类似于 <LibB/Header.h> 的东西将类从 B 导入到 A 并编写了一些实际使用 B 的代码。然后,我使用 <LibA/Header.h> 和 @ 将 A 和 B 导入到主项目中987654324@ 并编写了使用 A 和 B 的代码。最后,我使用终端转到 DerivedData 文件夹并导航到构建 A 的位置。我检查了 LibA.a 是否包含来自 LibB 的对象:
nm LibA.a
是的,它包含来自 LibB 的对象。所以,总而言之,通过这个简单的依赖设置,你应该能够得到你想要的。
编辑
要使 B 直接依赖 A 并将 A 链接到 B,请执行以下操作:
在XCode中打开A,进入Finder并将B项目文件拖放到A中。然后,选择A中的根元素,进入Build Phases,展开Target Dependencies,按'+'按钮,选择B并确认。然后展开 Link Binary With Libraries,按“+”按钮,选择 B.a(或任何产品名称)并确认。
重要
XCode 中有一个错误会阻止您将 B 项目文件正确放入 A 工作区。相反,您在 A 工作区中留下了 B 项目文件,但您无法展开 B 并对其进行任何操作。要解决此问题,请从 A 中删除错误的 B 项目文件引用,关闭 A,如果已打开则关闭 B。然后重新打开 A 并使用 Finder 导航到 B 项目文件,然后将 B 拖放到 A 工作区中。如果不起作用,请重复。
EDIT2
如果您无法访问 B(可能还有 A)的源代码,则只需将所需的标头复制到适当的位置即可。然后在您的主项目中,您不创建 A 直接依赖项,而是链接到您拥有的静态 libA.a 。如果 A 使用 B,则来自 B 的符号已经在 libA.a 中。您可以像我上面那样使用 nm 工具检查这一点。因此,我们打算将这些符号公开给带有 B 标头的主应用程序。有几种方法可以做到这一点,我记得我只是将标头复制到位于依赖链中间的库的 Copy Headers 目标路径中。之后,通过链接 A 并将 A 标头添加到 User Header Search Paths 我能够直接访问 B。什么是最适合您的方法取决于您是否可以访问 A 的来源。如果可以,有两种选择可供考虑:
- 将 B 标头添加到 A(它们将自动复制到 A 标头目标)。但我猜你不想要这个解决方案。
- 将自定义运行脚本构建阶段添加到 A 目标,这将抓取 B 标头并将它们复制到 A 标头目标。
在这两种情况下,您最终都会得到包含 A 和 B 的编译源的 LibA.a,以及包含 A 和 B 的标头的 headers 文件夹。然后您可以将主项目再次链接到 LibA.a 并添加标头您的主项目中 User Headers Search Path 的文件夹路径,您应该一切顺利。
重要
如果在您的库中,您的文件中仅包含类别代码,请确保将此库与 -force_load 链接,否则您的类别符号将无法正确打包。