你如何获得隐式依赖来处理Xcode 4中的工作空间?

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

示例工作区:DependenciesInXcode4.zip

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

构建失败

您可以看到构建失败的原因,因为它找不到依赖关系。

构建错误

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

手动链接

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

手动引用标题

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

  • 我应该如何管理Xcode工作区中的项目间的依赖关系?
  • 在需要时配置XCode 4工作区以构建依赖关系的正确方法是什么?
  • 看起来开发人员正在回归旧技术,而不是真正使用新的“隐式依赖”功能。

    我很感谢在理解如何获得“隐式依赖”来处理Xcode 4中的工作空间方面的一些帮助。

    这是我的问题:

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

  • 我刚刚花了两天的时间来完成和重建我们的项目,并努力解决这个问题。 虽然我现在有一个项目建立和正确链接,并有工作codesense我不是100%满意的步骤之一,因为它似乎有点破解,当然不符合我的概念“自动隐式依赖” 。

    FWIW这里是我采取的步骤:

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

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


    这确实看起来是Xcode在构建过程中处理隐式依赖关系时的一个错误。

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

    这是比我在别处概述的更容易的解决方案,因为它不需要更改工作区方案或任何项目的构建设置。 通过项目A的目录中的.h文件,Xcode能够自动查找并解决Project B对项目B的所有隐式依赖关系。

    不幸的是,你不能把.h文件放在他们自己的子目录中,叫做“XcodeBugWorkaroundHeaderFiles”。 他们必须在项目已经读取.h文件的目录中。 此外,别名不会工作,但符号链接将使用SymLinks,因此您不必担心过期的副本。

    尽管如此,我不确定具有“隐形”的.h文件,构建版本将失败是一个好主意。 在Xcode中修复bug之前,最好将它们添加到项目中,以便在Xcode中看到它们。


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

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

    因此,要在新项目中使用AcmeLib,只需拖动项目,将$ ACME_LIB添加到标题搜索路径中,即可。 XCode的隐式链接应该挂钩依赖关系。

    链接地址: http://www.djcxy.com/p/50989.html

    上一篇: How do you get implicit dependencies to work with workspaces in Xcode 4?

    下一篇: How to convert 2D float numpy array to 2D int numpy array?