如何在Xcode 4中使用隐式依赖项来处理工作空间?

时间:2011-04-04 03:11:55

标签: ios4 xcode4

我想使用Xcode 4和Cocoa Touch静态库项目管理工作区中的项目,这些项目包含我可以从其他项目引用的共享代码。根据WWDC 2010视频和Xcode 4文档,Xcode 4中的工作空间有一个“隐式依赖”功能。我一直在尝试使其工作,但我没有取得多大成功。

示例工作区:DependenciesInXcode4.zip

您可以看到最基本的示例项目有2个静态库项目,我将其命名为Library1和Library2。然后我在每个项目中都有一个类,我从名为PrimaryApp的iPhone项目中引用它。在添加import语句时,我得到了Code Sense的支持,但构建失败了。

Build Failed

您可以看到构建失败,因为它无法找到依赖项。

Build Errors

为了解决这些问题,我手动链接了Library1和Library2项目。

Manual Linking

我还必须将这些项目的路径添加为标题搜索路径。

Manually Reference Headers

现在,当我构建两个依赖库,然后在iPhone模拟器中运行PrimaryApp时,它会成功构建并运行。我发现它并不总是确保在必要时构建依赖项目,这显然是一个手动过程。这不是我认为的“隐式依赖”,因为Xcode视频和文档暗示它应该工作。我一直在寻找更具体的例子,但到目前为止我没有运气。即使在Stackoverflow上,我也没有看到令人满意的答案。

看起来开发人员正在回归旧技术而不是真正使用新的“隐式依赖”功能。

我很感激帮助理解如何在Xcode 4中使用“隐式依赖项”来处理工作区。

以下是我的问题:

  • “隐式依赖”如何在Xcode 4中使用工作空间?
  • 为什么不能在PrimaryApp中自动找到Libary1和Library2中的代码?
  • 是否需要进行其他更改才能使依赖项在工作区中起作用?

6 个答案:

答案 0 :(得分:12)

我刚刚花了两天的时间来构建和重建我们的项目,并在这个问题上苦苦挣扎。虽然我现在有一个正确构建和链接的项目并且有工作代码,但我对其中一个步骤并不百分之百,因为它似乎有点像黑客,当然不符合我的“自动隐式依赖”的概念。

FWIW这是我采取的步骤:

  1. 在Xcode中创建一个新的工作区。
  2. 将新项目添加到静态库的工作区。您还可以添加现有项目,我发现这也可以。
  3. 测试库是否按预期构建。
  4. 将新项目添加到主项目的工作区。我再次设法添加一个现有的,但重要的是它没有任何链接到库的构建设置。如果添加新项目,只需将现有源文件添加到其中即可。我的特殊情况由于一个非常大的预先存在的SVN存储库而变得复杂,我不想重构。
  5. 在此阶段,我将假设您的源代码已经包含静态库中的标头导入。
  6. 在主项目的构建阶段,展开“使用库链接二进制文件”部分,然后单击+符号。从静态库项目中选择目标。
  7. 如果你想在这个阶段你可以建立主项目,以确认它失败,如OP屏幕截图所示,标题导入“没有这样的文件......”错误。
  8. 现在这是我不喜欢的。在您的主项目中创建一个新组并将其称为Dependent Headers或其他任何内容。现在,在项目导航器中,将所有已使用的标题从静态项目拖到此新组。在弹出的选项中,我将其保留为默认设置。
  9. 您可能还需要将主项目与静态库使用的任何依赖库链接。例如,我的静态库使用libxml2和CFNetwork,即使我的主项目没有直接使用它,如果我没有将它们添加到“带库的链接二进制”构建阶段,我就会编译错误。
  10. 你的主要项目现在应该(希望)建立。
  11. 我真的不喜欢第8步和第9步。这真的感觉XCode并没有做广告宣传的事情。但是,如果它得到修复,至少这些步骤很容易退出,以便它能正常工作。

    我认为“隐式依赖”应该无需经过第6步,甚至第5步,但对于很多人来说,这可能有点过于自动化了。

答案 1 :(得分:3)

这确实似乎是Xcode在构建过程中处理隐式依赖项的错误。

在一个包含两个项目的工作空间中,我能够让Project A看到Project B中的类,并通过将Project B的类的.h头文件复制到Project A的目录中来成功构建。 注意:我没有将它们添加到Xcode中的项目A 我只是将它们放在Finder的项目A的目录中。

这是一个比我在别处看到的更简单的解决方案,因为它不需要更改工作区方案或任何项目的构建设置。使用项目A目录中的.h文件,Xcode能够自动查找并解决项目A对项目B的所有隐式依赖项。

不幸的是,您无法将.h文件放在名为“XcodeBugWorkaroundHeaderFiles”的子目录中。它们必须位于项目已经读取.h文件的目录中。此外,别名将无效,但符号链接将无效,因此通过使用SymLinks,您不必担心过时的副本。

所有这些都说明了,但我不确定拥有“隐形”.h文件,构建版本会失败,但这不是一个好主意。在Xcode中修复错误之前,最好将它们添加到项目中,以便在Xcode中看到它们。

答案 2 :(得分:1)

另一种选择是将每个“子项目”的根作为递归标题路径包含在内。例如,如果您有AcmeLib,则可以转到主项目的构建选项,并将AcmeLib的路径添加到用户标题搜索路径,并启用递归选项。然后将自动搜索AcmeLib的头文件。

为了保持开发人员之间的路径独立性,您可以创建相对于源目录变量的路径,例如$ ACME_LIB,每个开发人员都可以在XCode首选项“Sources”窗格中设置它。

因此,要在新项目中使用AcmeLib,只需拖动项目,将$ ACME_LIB添加到标题搜索路径,然后就可以了。 XCode的隐式链接应该连接依赖项。

答案 3 :(得分:1)

以下是Google Docs document中的所有说明。

答案 4 :(得分:1)

我通过以下方式让这个工作。 1.将库作为第二个项目添加到工作区。 2.将二进制文件与库链接>添加静态库。

- 重要部分 -

  1. 将以下内容添加到构建设置

    下的“标题搜索路径”中

    $ {BUILT_PRODUCTS_DIR}

  2. 这会将构建的头文件链接到项目。 没有更多的构建错误。

答案 5 :(得分:1)

要解决有关用户标题搜索路径中的空格的问题,请使用

"${BUILT_PRODUCTS_DIR}"