【问题标题】:How do you get implicit dependencies to work with workspaces in Xcode 4?在 Xcode 4 中,如何获得隐式依赖以使用工作区?
【发布时间】:2011-07-28 21:36:46
【问题描述】:

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

示例工作区:DependenciesInXcode4.zip

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

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

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

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

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

似乎开发人员正在回退到旧技术,并没有真正使用新的“隐式依赖”功能。

如果能帮助我了解如何在 Xcode 4 中使用“隐式依赖项”来处理工作区,我将不胜感激。

这是我的问题:

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

【问题讨论】:

标签: ios4 xcode4


【解决方案1】:

我刚刚花了两天时间构建和重建我们的项目,就在这个问题上苦苦挣扎。虽然我现在有一个可以正确构建和链接并且具有工作代码感知的项目,但我对其中一个步骤并不 100% 满意,因为它似乎有点 hack 并且肯定不符合我的“自动隐式依赖项”的概念.

FWIW 这是我采取的步骤:

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

我真的不喜欢第 8 步和第 9 步。这真的感觉 XCode 并没有像广告宣传的那样做。但是,如果它得到修复,至少这些步骤很容易退出,以便它正常工作。

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

【讨论】:

  • 瑞克,我同意。我已经向 Apple 提交了一份错误报告,并希望这个过程在短期内在文档中得到澄清,并最终像我们在未来 Xcode 版本中所期望的那样以更自动化的方式工作。
  • 第 8 步是因为工作区并没有真正“侵入”您的项目,因此将其他项目添加到工作区并不会真正将它们添加到工作区中已经存在的所有项目中......你必须像添加独立项目一样添加库和头文件路径。我不太确定这不是“像宣传的那样”,因为当您将它们都放在 WS 中时,它确实可以让您了解其他项目。但是我同意这很烦人,这也是我最初认为它会起作用的方式。我只是不确定它是否真的是一个错误,而不是期望处理。
  • 谢谢,它对我有用,但我的问题是当我在静态库中有扩展方法并在主应用程序中调用它时,它会抛出错误“无法识别的选择器发送到实例......”,.. . 有什么想法吗?
  • @ali 您需要将 -ObjC 标志添加到包含项目中。见stackoverflow.com/questions/2567498/…
【解决方案2】:

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

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

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

很遗憾,您不能将 .h 文件放在它们自己的名为“XcodeBugWorkaroundHeaderFiles”的子目录中。它们必须位于项目已经从中读取 .h 文件的目录中。此外,别名不起作用,但符号链接可以,因此通过使用符号链接,您不必担心副本过期。

虽然说了这么多,但我不确定拥有构建构建将失败的“隐形”.h 文件是一个好主意。在 Xcode 中修复错误之前,最好将它们添加到项目中,以便您可以在 Xcode 中看到它们。

【讨论】:

    【解决方案3】:

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

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

    所以要在新项目中使用 AcmeLib,只需将项目拖入,将 $ACME_LIB 添加到 header 搜索路径,就可以了。 XCode 的隐式链接应该连接依赖项。

    【讨论】:

    • 如果您的库具有以下类别,您可能还需要添加一些额外的链接器标志:-ObjC -force_load $TARGET_BUILD_DIR/libAcme.a
    【解决方案4】:

    这是一个Google Docs document中的所有说明。

    【讨论】:

      【解决方案5】:

      我通过执行以下操作使其工作。 1. 将库作为第二个项目添加到工作区。 2. Link Binary with Libraries > 添加静态库。

      -- 重要部分--

      1. 将以下内容添加到构建设置下的“标题搜索路径”

        ${BUILT_PRODUCTS_DIR}

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

      【讨论】:

        【解决方案6】:

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

        "${BUILT_PRODUCTS_DIR}"
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-10-14
          • 1970-01-01
          • 2012-12-30
          • 2011-03-20
          • 1970-01-01
          • 2011-09-03
          相关资源
          最近更新 更多