ios - Xcode 如何找到隐式目标依赖项?

标签 ios xcode macos

Xcode 有时会自动查找依赖项。当我是定义关系的人并且当我变得懒惰时,我认为这是可以的......

但我经常发现自己面临着一个具有多个目标的现有(大中型)项目。由于该项目是由其他人完成的,我发现很难理解目标取决于什么,因为并非所有关系都是明确的

Xcode 用于查找此类关系的规则是什么?(我希望我能理解其中的逻辑,以便在脑海中运行它,也许可以节省我一些时间 future )或者是什么让一个目标有资格隐含地依赖于另一个目标?

A target and the product it creates can be related to another target. If a target requires the output of another target in order to build, the first target is said to depend upon the second. If both targets are in the same workspace, Xcode can discover the dependency, in which case it builds the products in the required order. Such a relationship is referred to as an implicit dependency.

来源:iOS Developer Library → Xcode Concepts → Xcode Target

最佳答案

这个答案适用于 Xcode 8.x,我认为适用于 Xcode 9.0。

首先,您需要确保在您尝试构建的方案的构建面板中启用了“查找隐式依赖项”。

可以通过两种方式使目标“A”“隐式”依赖于目标“B”:

  1. 目标 A 有一个“Link Binary With Libraries”构建阶段,其列表中有一个库与 B 的产品具有相同的名称。该产品可以在同一个项目中,也可以工作区中的另一个项目。请注意,我说的是“同名”。仅仅因为您从目标 A 选择了 libA.a 并不意味着如果您在不同的目标中有另一个 libA.a 产品,则隐式依赖项将构建它。详情请见下文。
  2. 目标 A 有一个“复制文件阶段”,用于复制具有与 B 的产品相匹配的基本名称 的文件。通常,“复制文件”构建阶段不能引用不是“t 在与其目标相同的项目中,但是如果您为“复制文件”阶段创建一个虚拟文件以复制它与 B 的产品具有相同的名称,则可以跨项目设置依赖关系。例如,如果您有包含两个项目 ProjectA 和 ProjectB 的工作区。 ProjectA 具有创建 libA.a 的 TargetA,而 ProjectB 具有创建 libB.a 的 TargetB。 TargetA 可以让 TargetB 构建 libB.a,方法是将“假”零字节文件作为 TargetA 的一部分,恰好命名为 libB.a,这足以生成 libB.a,即使 libB.a 被引用to 在“复制文件”阶段是一个与 TargetB 构建的产品输出完全不同的文件。如果选中“仅在安装时复制”框,Xcode 不会实际执行复制,但仍会解析依赖关系。实际上,您可以从驱动器中删除您创建的虚假文件,只是为了将某些内容放入“复制文件”阶段(但您必须将其保留在您的项目中)。

那么为什么会有人想要做“2”的恐怖?我可以想出几个原因。

  1. TargetA 需要一些由 TargetB 复制/生成的文件,但 TargetB 不会生成要链接到的库。您可以通过让 TargetB 生成一个小的虚拟库来解决这个问题,但由于其他原因,这可能会很痛苦。
  2. 假设我有 projectA、targetA 和 libA.a(以及项目 B、C 和 D 的等效项),而 libA.a 依赖于 libB.a 和 libC.a,它们都需要先构建 libD.a(可能会生成一些 header 和/或源)。您可以使用“与库链接”阶段(也称为解决方案#1)来完成这一切,但在这种情况下,您最终会在 libA 的最终链接版本中得到 libD 中 .o 文件的两个副本。如果你做的足够深(例如,一个有 40 个项目的工作区,这些项目相互之间的依赖程度不同),你将很快得到巨大的库文件,其中有几个相同的 .o 文件,你的链接时间将变得可怕。

如果您认为这些是人为的情况,我目前正在打击它们,将一些遗留代码从一系列显式依赖关系转移到隐式依赖关系。为什么我转向隐式依赖?因为 Xcode 中的显式依赖项需要项目嵌套,一旦获得足够多的显式依赖项,项目浏览器就会变得非常慢,您会在 Xcode 中看到很多乱七八糟的东西。

如果您碰巧在同一个工作区内有两个目标生成同名产品并依赖于来自第三个目标的产品,会发生什么情况?隐式依赖会选择一个。它似乎根据产品的基本名称进行匹配(因此 foo/bar.a 和 baz/bar.a 相同),并将选择它找到的第一个。

关于ios - Xcode 如何找到隐式目标依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37794402/

相关文章:

ios - 无法通过 iphone sdk 中的 [FBSDKAccessToken currentAccessToken] 获取访问 token

ios - 横向模式下的 Xcode iPad 分辨率

macos - 在 Mac OS X 10.6 上安装 numpy 时出错

c# - 针对 .NET 和 Mono 的跨平台线图库的建议

macos - Hadoop Namenode格式在Mac上失败

iOS touchesMoved 第一次和第二次通话之间的延迟

ios - 使导航栏标题成为按钮(Swift)

ios - GIT 与 RestKit 的混淆

ios - 为什么会出现错误 'Domain=NSCocoaErrorDomain Code=3840 "No value ."UserInfo={NSDebugDescription=No value.}'?

ios - 如何访问具有多个元素的字典键中的元素?