Ios4 如何使隐式依赖关系与Xcode 4中的工作空间一起工作?

Ios4 如何使隐式依赖关系与Xcode 4中的工作空间一起工作?,ios4,xcode4,Ios4,Xcode4,我想使用Xcode 4和Cocoa Touch静态库项目管理工作区中的项目,这些项目包含我可以从其他项目中引用的共享代码。根据WWDC 2010视频和Xcode 4文档,Xcode 4中的工作空间具有“隐式依赖”功能。我一直在努力使它发挥作用,但我没有取得多大成功 示例工作区: 您可以看到非常基本的示例项目有两个静态库项目,我将其命名为Library1和Library2。然后,我在每个项目中都有一个单独的类,我从iPhone项目中引用了这个类,名为PrimaryApp。我在添加import语句时

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

示例工作区:

您可以看到非常基本的示例项目有两个静态库项目,我将其命名为Library1和Library2。然后,我在每个项目中都有一个单独的类,我从iPhone项目中引用了这个类,名为PrimaryApp。我在添加import语句时获得了代码感知的支持,但构建失败

您可以看到构建是如何失败的,因为它找不到依赖项

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

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

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

看来,开发人员正在回到旧技术,而不是真正使用新的“隐式依赖”特性

如果能帮助我理解如何使用Xcode 4中的工作区获得“隐式依赖”,我将不胜感激

以下是我的问题:

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

我刚刚花了两天的大部分时间来建设和重建我们的项目,正是为了解决这个问题。虽然我现在有一个正确构建和链接的项目,并且有工作的codesense,但我对其中一个步骤不是100%满意,因为它看起来有点像黑客,当然不符合我的“自动隐式依赖”概念

FWIW以下是我采取的步骤:

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


    我认为“隐式依赖项”应该可以工作,而不需要经过步骤6,甚至步骤5,但对于很多人来说,这可能有点太自动了。

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

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


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

    这里是一个完整的说明。

    这似乎确实是XCode在构建过程中处理隐式依赖项的一个缺陷

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

    这是
    "${BUILT_PRODUCTS_DIR}"