59

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

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

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

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

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

4

7 回答 7

24

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

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

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

方案设置 项目布局

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

在此处输入图像描述 在此处输入图像描述

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

HTH。安迪·W。

于 2011-03-30T12:26:36.107 回答
9

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

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

于 2011-04-04T19:31:31.813 回答
1

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

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

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

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

于 2011-04-21T07:25:13.923 回答
1

我这样做的防弹解决方案:

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

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

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

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

于 2013-01-22T18:56:05.057 回答
0

我在创建类似框架的静态库方面取得了一些成功,尽管它不是一个完美的解决方案。

于 2011-09-25T00:59:54.203 回答
0

我看到了下一个变体:

  1. Explicit dependency在一个项目中[关于]
  2. Implicit dependency在工作区[关于]
于 2019-08-29T15:15:41.817 回答
-1

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

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

“Xcode 检查构建目录中的文件以发现隐式依赖关系。例如,如果工作区中的一个项目构建了一个库,该库与同一工作区中的另一个项目链接,Xcode 会在构建另一个项目之前自动构建该库, “

于 2011-03-30T10:02:13.757 回答