Xcode有时会自动找到依赖关系。我认为当我是定义关系的人,当我变懒的时候,这是可以的。
但我经常发现自己面对的是一个已有的(中型到大型)项目,它有多个目标,因为这个项目是别人做的,我发现很难理解哪些目标依赖于什么,因为 * 不是所有的关系都是明确的 *。
- Xcode使用什么规则来寻找这样的关系?(我希望我能理解逻辑,这样就可以在脑海中运行它,也许可以节省我将来的一些时间)或者什么使一个目标可以隐式依赖于另一个目标?**
一个目标及其创建的产品可以与另一个目标相关。如果一个目标需要另一个目标的输出才能构建,则称第一个目标依赖于第二个目标。如果两个目标位于同一个工作区,Xcode可以发现这种依赖关系,在这种情况下,Xcode会按照所需的顺序构建产品。这种关系称为隐式依赖关系。
来源:iOS Developer Library → Xcode Concepts → Xcode Target
2条答案
按热度按时间t40tm48m1#
这个答案适用于Xcode 8.x,我认为也适用于Xcode 9.0。
首先,您需要确保在您试图构建的Scheme的Build面板中启用了“Find Implicit Dependencies”。
可以通过两种方式使目标“A”“隐式”依赖于目标“B”:
1.目标A有一个“Link Binary With Libraries”构建阶段,该阶段的列表中有一个库,该库与B的产品具有相同的名称。此产品可以位于同一个项目中,也可以位于工作区中的另一个项目中。请注意,我说的是“相同的名称”。仅仅因为您从目标A中选择了libA. a,并不意味着如果您有另一个libA,隐式依赖关系将构建它。不同目标中的产品。有关详细信息,请参阅以下内容。
1.目标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实际上不会执行复制,但仍然会解决依赖关系。您实际上可以从您的驱动器中删除您创建的假文件,它仅仅是为了在“复制文件”阶段有一些东西可以放入(但您必须将它留在您的项目中)。
那么,为什么会有人想要做恐怖的是“2”呢?我可以想出几个原因。
1.假设我有项目A、目标A和libA. a(以及项目B、C和D的同等项目),和libA. a依赖于libB. a和libC. a,这两个库都需要先构建libD. a(可能生成了一些头文件和/或源代码)。您可以使用“与库链接”阶段完成所有操作(也称为解决方案#1),但在这种情况下,您将在最终的libA链接版本中得到libD中.o文件的两个副本。(例如,一个工作区中有40个项目,这些项目彼此之间的依赖程度各不相同)您很快就会得到大量的库文件,其中包含几个相同的.o文件,并且您的链接时间将变得非常可怕。
如果你认为这些都是人为的情况,那么我现在正在尝试将一些遗留代码从一系列显式依赖项移到隐式依赖项。为什么我要移到隐式依赖项?因为Xcode中的显式依赖项需要项目嵌套,一旦你获得了足够多的显式依赖项,项目浏览器就会变得非常慢,你会在Xcode中看到很多随机的东西。
如果同一个工作区中碰巧有两个目标生成同名的产品,并依赖于第三个目标,会发生什么情况?隐式依赖项将选择一个。它似乎是基于产品的基本名称进行匹配(因此foo/bar. a和baz/bar. a是相同的),并将选择找到的第一个。
5n0oy7gb2#
Xcode隐式依赖项
Xcode
Dependency
About(https://stackoverflow.com/a/59215808/4770877)是构建选定目标所需的依赖项。Implicit
相关性*源代码aka
Non-compiled dependencies
。Xcode允许从整个workspace
添加依赖项。一个很好的例子是来自GitHub或CocoaPods
About(https://stackoverflow.com/a/59218904/4770877)的项目及其源代码*封闭代码aka
Precompiled dependencies
akaExternal
-外部二进制、CocoaPods
、Carthage
(带有封闭代码)Implicit dependency
是成功构建目标所必需的依赖项,但未显式定义。1.在
General
-〉Framework, Libraries, and Embedded Content
或“嵌入式二进制文件和链接框架及库Link vs Embed(https://stackoverflow.com/a/59216858/4770877)”中指定Build Phases -> Dependencies || Target Dependencies
中无依赖关系要打开此功能No such module(https://stackoverflow.com/a/59216742/4770877)
Explicit dependency(https://stackoverflow.com/a/59219025/4770877)
Vocabulary(https://stackoverflow.com/a/59216151/4770877)