我应该如何在Xcode工作区中跨项目管理依赖项?

时间:2011-03-30 08:34:15

标签: xcode xcode4 build-dependencies

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

  • 将两者都构建为同一方案的一部分。我尝试这种方式的方法是编辑我的应用程序的方案,将“libjson.a”添加到方案的“Build”部分,并选择“Find Implicit Dependencies”方式。然后我转到我的app目标的目标编辑器,在“Build Phases” - >“Link Binary With Libraries”中,我从工作区库列表中选择“libjson.a”。 当我随后尝试构建该方案时,我看到它构建了库目标,但构建应用程序目标失败,链接器错误“找不到-ljson的库” - 表明它实际上没有发现库已经构建。实际上,在项目导航器中,库的应用程序项目下的条目仍为红色,表示该文件不存在。

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

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

应该考虑在同一工作区中的不同项目中连接这些目标的“Xcode 4-ish”方式?如果同一工作空间中的多个项目实际上不能彼此交互,那么似乎缺乏。 谢谢, 格雷厄姆。

7 个答案:

答案 0 :(得分:23)

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

您可以删除兄弟项目(如果已有)。

在我看来,点击它的构建就可以了。

Scheme Settings Project Layout

如果您有两个项目,我想有内部路径混淆,我倾向于在“视图” - >“实用程序” - >“文件检查器”中调整位置设置,看看有什么影响具有

enter image description here enter image description here

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

HTH。安迪W。

答案 1 :(得分:9)

我设法让工作区中的项目之间的依赖关系像我在这里描述的那样工作:http://blog.carbonfive.com/2011/04/04/using-open-source-static-libraries-in-xcode-4/

不幸的是,我找不到让Xcode发现隐式依赖关系的方法,也不会像广告中那样索引构建中的所有内容。我找到了两者的解决方法,但我希望随着Xcode 4的成熟,需要更少的手动配置。

答案 2 :(得分:1)

我会问同样的问题,认为我自己的解决方案不对。但我不认为这里提到它,它似乎确实有效。显然,XCode 4正在进行中。 :)

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

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

所以它可行,并且显然有一些自动依赖性检查在这里进行。但感觉不对。然后,模态方案编辑器/管理器以及项目导航器中缺少工作空间对象也是如此...我从未想过我会这么说,但Visual Studio UI(bleh)更加清晰。

答案 3 :(得分:1)

我的防弹解决方案:

在主项目(不是lib)的Build Settings中创建“Per Debug-Release / Per Architecture”设置,以包含 ../MyLibProject/build/Debug-iphoneos 要么 ../MyLibProject/build/Release-iphonesimulator 要么 等等。
取决于配置(您可以通过单击Debug或Release旁边的+来创建这种配置,并选择“Any iOS Simulator SDK”或“任何iOS SDK”。 您需要为“标题搜索路径”(如果您的库复制一些标题文件,这很可能)和“库搜索路径”都这样做。这意味着对于每个设置,您可能最终会有4种不同的路径(调试模拟,调试ios,发布模拟,发布ios)。 这将确保两个项目的配置匹配。

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

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

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

答案 4 :(得分:0)

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

答案 5 :(得分:0)

我看到了下一个变体:

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

答案 6 :(得分:-1)

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

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

  

“Xcode检查构建目录中的文件以发现隐式依赖关系。例如,如果工作空间中包含的一个项目构建一个由同一工作空间中的另一个项目链接的库,Xcode会在构建之前自动构建库其他项目,即使构建配置没有使此依赖项显式化。如果需要,您可以使用显式构建设置覆盖此类隐式依赖项。对于显式依赖项,您必须创建项目引用。“