【问题标题】:How should I manage dependencies across projects in an Xcode workspace?我应该如何在 Xcode 工作区中管理跨项目的依赖关系?
【发布时间】:2011-03-30 08:34:15
【问题描述】:

我正在开发一个 iOS 应用项目,并将 json-framework 项目添加到工作区。左侧的项目导航器显示了两个项目,构建方案选择器也显示了两个项目的方案。现在我想将 json-framework 项目中的 libjson.a 目标添加为对另一个项目中 iOS 应用程序目标的依赖项。预期的结果是,每当构建应用程序目标时,它都会构建(如有必要)库目标并将应用程序目标链接到它。以下是我尝试过的方法:

  • 将两者构建为同一方案的一部分。我尝试这样做的方法是编辑我的应用程序的方案,将“libjson.a”添加到方案的“构建”部分,并顺便检查“查找隐式依赖项”。然后我转到我的应用程序目标的目标编辑器,并在“构建阶段”->“将二进制文件与库链接”中,从工作区库列表中选择“libjson.a”。 当我随后尝试构建该方案时,我看到它构建了库目标,但构建应用程序目标失败,并出现链接器错误“未找到 -ljson 的库” - 这表明它实际上并未发现已构建库。实际上在项目导航器中,该库的应用项目下的条目仍然是红色的,表明该文件不存在。

  • 将 json 目标添加为显式依赖项。为了尝试这个,我不修改构建方案,而是转到我的应用程序目标的目标编辑器,然后单击“目标依赖项”下的添加按钮。工作区中没有来自其他项目的目标显示,所以这是一个非首发。

  • 将 JSON 项目拖到另一个项目中,然后将目标添加为依赖项。这就是我在 Xcode 3 中所做的。在项目导航器中,我抓取库项目并将其拖到应用程序项目上。这会打开通常的“添加文件”窗格,我只需单击“完成”即可将其关闭。 现在项目导航器中有 两个 条目用于库项目:一个在顶层,一个在 app 项目下。我现在可以使用目标编辑器将库目标添加为应用程序目标的依赖项,并且可以在链接库阶段链接它而不会出错。但它看起来很糟糕:导航器中有同一个项目的多个条目。有没有其他方法可以做到这一点?

在同一工作区的不同项目中连接这些目标的“Xcode 4-ish”方式应该被认为是什么?如果同一工作区中的多个项目实际上不能相互交互,这似乎是缺乏的。 谢谢, 格雷厄姆。

【问题讨论】:

    标签: xcode xcode4 build-dependencies


    【解决方案1】:

    我刚刚设置了一个测试项目,就像您在版本 3 中描述的那样,通过创建一个新工作区并将两个 Xcode 项目拖入其中,如图所示嵌套。

    如果你已经有同级项目,你可以删除它。

    据我所知,在此基础上进行构建,它就可以正常工作。

    如果你有两个项目,我想会有内部路径混乱,我倾向于在“视图”->“实用程序”->“文件检查器”中摆弄位置设置,看看有什么效果。

    要尝试的另一件事是在 Xcode“首选项...”->“源树”中设置路径并以这种方式引用它们,如下所述:Easy, Modular Code Sharing Across iPhone Apps: Static Libraries and Cross-Project References

    HTH。安迪·W。

    【讨论】:

    • 我希望这在我们的两台机器上都能正常工作! :) 我看到完全相同的设置不起作用,我把它归结为一般 Xcode 4 片状。
    • 我遇到了同样的问题,并通过编辑方案并关闭构建和存档的瘫痪构建来修复它们。这解决了我的问题。
    • 如果你必须使用子项目,那么 Xcode 4 工作区有什么意义?
    • 工作区有助于将相关的东西组合在一起。使构建目标、处理子项目、库的构建路径和方案更加方便。组织比其他任何事情都重要,因此您可能会看到好处,也可能看不到好处,具体取决于您的工作方式。
    【解决方案2】:

    我设法使工作区中的项目之间的依赖关系能够按照我在此处描述的那样工作:http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

    不幸的是,我找不到让 Xcode 发现隐式依赖项或索引构建中的所有内容的方法。我找到了两种解决方法,但我希望随着 Xcode 4 的成熟,需要更少的手动配置。

    【讨论】:

    • 精湛的博客条目!帮了我很多! +1
    • 在 4.2 中,在非常复杂的项目设置(许多库和应用程序子项目包含一个或两个目标)上,该过程几乎完美无缺。唯一不起作用的是链接。我必须将“$(BUILD_ROOT)/$(CONFIGURATION)”添加到库搜索路径中,以便可以找到库兄弟项目中的所有产品。您的“添加静态库的标题”部分为我指明了正确的方向。谢谢!
    【解决方案3】:

    我打算问同样的问题,认为我自己的解决方案不可能是正确的。但我没有看到这里提到它,它似乎确实有效。显然 XCode 4 是一项正在进行的工作。 :)

    我有一个包含两个项目的工作区:一个静态库和一个使用该库的应用程序。这些项目是兄弟姐妹。每个项目都有自己的方案,每个方案都设置为只构建一个目标。换句话说,我在工作区中添加了两个项目,就是这样。

    要将静态库添加为应用程序的依赖项,我只需将 libsomething.a 产品从库项目(Project Navigator)拖到应用程序目标的“Link Binary with Libraries”列表中。就是这样。现在,当我构建应用程序时,首先构建库项目然后链接。有趣的是,当我修改应用程序的方案以使用不同的配置(例如,Release 而不是 Debug)时,库是使用相同的配置构建的。

    所以它起作用了,而且这里显然正在进行一些自动依赖检查。但是感觉不对。话又说回来,模态方案编辑器/管理器也是如此,项目导航器中缺少工作区对象……我从没想过我会这么说,但 Visual Studio UI (bleh) 要清晰得多。

    【讨论】:

      【解决方案4】:

      我的防弹解决方案:

      在主项目(不是 lib)的 Build Settings 中创建“Per Debug-Release / Per Architecture”设置,以包括 ../MyLibProject/build/Debug-iphoneos 或者 ../MyLibProject/build/Release-iphonesimulator 或者 等等。
      取决于配置(您可以通过单击 Debug 或 Release 旁边的 + 并选择“Any iOS Simulator SDK”或“any iOS SDK”来创建此类配置。 您需要为“标题搜索路径”(如果您的库复制一些头文件,这很可能)和“库搜索路径”都这样做。这意味着对于每个设置,您最终可能会得到 4 条不同的路径(debug sim、debug ios、release sim、release ios)。 这将确保两个项目的配置匹配。

      现在,要自动编译库,即创建依赖项,您可以使用上面给出的“构建阶段 -> 使用库链接到二进制文件 -> + -> 选择 .a 文件”建议。

      这是我设法为 xcode 4.5 上的每个环境正确构建和链接的唯一方法

      注意:我什至在“其他链接器标志”中添加了 -lmyLib 标志,但我不确定这是否真的有必要

      【讨论】:

        【解决方案5】:

        我在创建 framework-like static libraries 方面取得了一些成功,尽管这不是一个完美的解决方案。

        【讨论】:

          【解决方案6】:

          我看到了下一个变种:

          1. Explicit dependency 在一个项目中[About]
          2. Implicit dependency 在工作区中[About]

          【讨论】:

            【解决方案7】:

            请参阅 Xcode 用户指南:Xcode 概念 ->“工作区中的项目共享构建目录”下的 Xcode 工作区。

            单个工作区中的所有项目共享一个构建目录。依赖项会自动发现并在需要时构建:

            "Xcode 检查构建目录中的文件以发现隐式依赖关系。例如,如果工作区中的一个项目构建了一个库,该库与同一工作区中的另一个项目链接,Xcode 会在构建之前自动构建库。其他项目,即使构建配置未明确此依赖项。如有必要,您可以使用显式构建设置覆盖此类隐式依赖项。对于显式依赖项,您必须创建项目引用。"

            【讨论】:

            • 我的问题已经表明这种方法行不通。
            • 我已经让它工作了,但是在我用两个项目创建的新工作区中,这似乎不再工作了。我仍然认为这是使用依赖项的“Xcode 4-ish”(这是您所要求的),错误可能只是阻止该方法正常工作。似乎现在唯一能做到这一点的方法就是丑陋的技术。
            • 暂别我的最后一条评论,隐式依赖似乎确实有效。我创建了一个测试工作区 + 两个项目(使用库的库 + 应用程序)。构建应用程序将自动构建库。项目的创建类似于第一个要点。将代码克隆到:bitbucket.org/kluivers/dependencies-demo
            • 有时会,有时不会。你的项目对我有用。但是我(在 XCode 4 中)创建了一个几乎相同的,它不起作用(或者至少不一致:清理后的第一个构建通常是可以的,但后续构建不会重建库以反映新的变化)。
            • 这将每次都有效,但仅当您对项目进行了更正,要求您直接编辑 .pbxproj。我正在使用这种技术,但我不确定它是否真的值得。
            猜你喜欢
            • 2013-01-16
            • 1970-01-01
            • 2011-03-01
            • 1970-01-01
            • 2017-09-24
            • 2013-12-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多