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

时间:2016-06-13 16:04:58

标签: ios xcode macos

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

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

Xcode用来查找这种关系的规则是什么?(我希望我能理解逻辑,所以在我脑海里运行它可能会节省我一些时间未来)或什么使目标有资格隐含地依赖另一个?

  

目标及其创建的产品可能与另一个目标相关。如果目标需要另一个目标的输出以便构建,则说第一个目标依赖于第二个目标。如果两个目标都位于同一工作空间中,Xcode可以发现依赖关系,在这种情况下,它会按所需顺序构建产品。这种关系被称为隐式依赖。

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

2 个答案:

答案 0 :(得分:8)

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

首先,您需要确保在您尝试构建的Scheme的Build面板中启用了“Find Implicit Dependencies”。

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

  1. 目标A具有“链接二进制库”构建阶段,其列表中的库具有与相同名称的库。此产品可以位于同一项目中,也可以工作区中的另一个项目。请注意,我说“同名”。仅仅因为您从目标A中选择了libA.a并不意味着如果您在另一个目标中有另一个libA.a产品,则隐式依赖项将构建它。有关详细信息,请参见下文。
  2. 目标A具有“复制文件阶段”,该文件复制具有与B的产品匹配的基本名称的文件。通常,“复制文件”构建阶段不能引用不是'的文件在与目标相同的项目中,但如果为“复制文件”阶段创建一个虚拟文件,并且与B的产品同名,则可以跨项目设置依赖关系。例如,如果有包含两个项目ProjectA和ProjectB的工作空间。 ProjectA具有创建libA.a的TargetA,而ProjectB具有创建libB.a的TargetB。 TargetA可以通过将一个“假的”零字节文件作为TargetA的一部分来命名libB.a来使TargetB构建libB.a,这就足以得到libB.a,即使libB.a引用了在“复制文件”阶段,与TargetB构建的产品输出完全不同。如果选中“仅在安装时复制”框,Xcode将不会实际执行复制,但仍将解决依赖关系。实际上,您可以删除您创建的驱动器中的伪文件,只是为了将某些内容放入“复制文件”阶段(但您必须将其保留在项目中)。
  3. 那么为什么有人想做“2”的恐怖?我可以提出几个原因。

    1. TargetA需要一些由TargetB复制/生成的文件,但TargetB不会生成要链接的库。你可以通过让TargetB生成一个小的虚拟库来解决这个问题,但由于其他原因,这可能会很痛苦。
    2. 假设我有projectA,targetA和libA.a(以及项目B,C和D的等价物),而libA.a依赖于libB.a和libC.a,它们都需要首先构建libD.a(可能会产生一些标题和/或来源)。您可以使用“Link With Libraries”阶段(也称为解决方案#1)完成所有操作,但在这种情况下,您最终会在libA的最终链接版本中以libD中的两个.o文件副本结束。如果你这么做得足够深(例如,一个工作区有40个项目,彼此之间有不同程度的依赖关系),你很快就会得到包含几个相同.o文件的巨大库文件,你的链接时间将变得可怕。
    3. 如果您认为这些都是人为的情况,那么我目前正在努力将一些遗留代码从一系列显式依赖项转移到隐式依赖项。为什么我要转向隐式依赖?因为Xcode中的显式依赖需要项目嵌套,一旦你获得了足够的显式依赖,项目浏览器变得非常慢,你会在Xcode中看到很多沙滩球随机的东西。

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

答案 1 :(得分:0)

Xcode Dependency [About]构建选定目标所必需的依赖项。

Xcode支持ImplicitExplicit [About]依赖性。

Implicit依赖性

  • 源代码,也称为Non-compiled dependencies。 Xcode允许添加整个workspace中的依赖项。一个很好的例子是来自GitHub或CocoaPods [About]的源代码
  • 的项目。
  • 封闭代码,又名Precompiled dependencies又名External-例如外部二进制文件(库-框架的.a-.framework)或CocoaPods,且代码为[About]Carthage

Implicit dependency是成功构建目标所必需的依赖性,但未明确定义。

  1. Build Phases -> Target Dependencies中没有依赖项
  2. General -> Embedded BinariesLinked Frameworks and Libraries [Link vs Embed]中指定

要启用此功能[No such module]

Edit Scheme -> Build -> Find Implicit Dependencies

Vocabular