首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何获得隐式依赖关系来处理Xcode 4中的工作区?

如何获得隐式依赖关系来处理Xcode 4中的工作区?
EN

Stack Overflow用户
提问于 2011-04-04 03:11:54
回答 6查看 17.3K关注 0票数 32

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

示例工作区:DependenciesInXcode4.zip

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

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

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

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

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

看起来,开发人员回到了旧的技术上,并没有真正使用新的“隐式依赖”特性。

我希望在理解如何让“隐式依赖”使用Xcode 4中的工作区方面提供一些帮助。

以下是我的问题:

  • 在带有工作区的Xcode 4中,“隐式依赖”应该如何工作?
  • 为什么Libary1和Library2中的代码不能在PrimaryApp中自动找到?
  • 是否需要其他更改才能使依赖关系在工作区中工作?
EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2011-04-07 21:25:43

我刚刚花了两天的时间来建造和重建我们的项目,只为这个问题而奋斗。虽然我现在有一个正确构建和链接并具有工作代码的项目,但我对其中一个步骤并不百分之百满意,因为它似乎有点麻烦,而且肯定不符合我的“自动隐式依赖”的概念。

以下是我所采取的步骤:

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

我真的不喜欢第8步和第9步,这真的让人觉得XCode并没有做它所要做的事情。然而,如果和当它被修复,至少这些步骤是相当容易退出,以使它正确工作。

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

票数 12
EN

Stack Overflow用户

发布于 2011-11-14 03:30:47

这确实是Xcode在构建过程中处理隐式依赖的一个bug。

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

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

不幸的是,您不能将.h文件放在它们自己的子目录"XcodeBugWorkaroundHeaderFiles“中。它们必须位于项目已经从其中读取.h文件的目录中。另外,别名不起作用,但是符号链接会起作用,所以通过使用SymLinks,您不必担心过时的副本。

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

票数 3
EN

Stack Overflow用户

发布于 2011-05-24 13:38:33

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

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5534235

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档