我想使用 Xcode 4 和 Cocoa Touch 静态库项目来管理工作区中的项目,其中包含我可以从其他项目引用的共享代码。根据 WWDC 2010 视频和 Xcode 4 文档,Xcode 4 中的工作区有一个“隐式依赖项”功能。我一直在努力使其工作,但没有取得太大成功。
示例工作区:Xcode4.zip 中的依赖项 http://www.smallsharptools.com/downloads/iOS/DependenciesInXcode4.zip
您可以看到非常基本的示例项目有 2 个静态库项目,我将其命名为 Library1 和 Library2。然后,我在每个项目中都有一个类,我从名为 PrimaryApp 的 iPhone 项目中引用了该类。添加导入语句时,我得到了 Code Sense 的支持,但构建失败。
您可以看到构建如何因找不到依赖项而失败。
为了解决这些问题,我添加了手动链接的 Library1 和 Library2 项目。
我还必须将这些项目的路径添加为标题搜索路径。
现在,当我构建两个依赖库,然后在 iPhone 模拟器中运行 PrimaryApp 时,它会成功构建并运行。我发现它并不总是确保在必要时构建依赖项项目,这显然是一个手动过程。这不是我所认为的“隐式依赖关系”,因为 Xcode 视频和文档暗示它应该可以工作。我一直在寻找更具体的例子,但到目前为止我还没有运气。即使在 Stackoverflow 上我也没有看到令人满意的答案。
- 我应该如何管理 Xcode 工作区中项目之间的依赖关系? https://stackoverflow.com/questions/5483909/how-should-i-manage-dependencies-across-projects-in-an-xcode-workspace
- 配置 XCode 4 工作区以在需要时构建依赖项的正确方法是什么? https://stackoverflow.com/questions/5427396/whats-the-correct-way-to-configure-xcode-4-workspaces-to-build-dependencies-when
开发人员似乎正在退回到旧技术,而不是真正使用新的“隐式依赖项”功能。
我希望能够帮助您了解如何获取“隐式依赖项”来使用 Xcode 4 中的工作区。
这是我的问题:
- “隐式依赖项”应该如何在 Xcode 4 中与工作区一起工作?
- 为什么PrimaryApp中无法自动找到Libary1和Library2中的代码?
- 是否需要进行其他更改才能使依赖项在工作区中正常工作?
我刚刚花了两天的时间来构建和重建我们的项目,一直在努力解决这个问题。虽然我现在有一个可以正确构建和链接并且具有有效代码感知的项目,但我对其中一个步骤并不是 100% 满意,因为它似乎有点黑客,而且肯定不符合我的“自动隐式依赖关系”的概念。
FWIW这是我采取的步骤:
- 在 Xcode 中创建一个新的工作区。
- 将新项目添加到静态库的工作区。您还可以添加现有项目,我发现这也可行。
- 测试库是否按预期构建。
- 将新项目添加到主项目的工作区。我再次设法添加一个现有的,但重要的是它没有任何链接到库的构建设置。如果您添加一个新项目,只需向其中添加现有源文件就相当容易了。我的特殊情况因我不想重组的一个非常大的预先存在的 SVN 存储库而变得复杂。
- 在这个阶段,我将假设您的源代码已经包含从静态库导入的标头。
- 在主项目的构建阶段,展开“将二进制文件与库链接”部分并单击 + 符号。从静态库项目中选择目标。
- 如果您想在这个阶段,您可以构建主项目来确认它是否失败,如 OP 屏幕截图所示,标头导入出现“没有这样的文件...”错误。
- 现在这是我不太喜欢的一点。在您的主项目中创建一个新组并将其命名为“Dependent Headers”或其他名称。现在在项目导航器将静态项目中所有使用过的标题拖到这个新组中。在弹出的选项中,我只是将其保留为默认设置。
- 您可能还需要将主项目与静态库使用的任何依赖库链接。例如,我的静态库使用 libxml2 和 CFNetwork,即使我的主项目不直接使用它们,如果我没有将它们添加到“链接二进制文件与库”构建阶段,我也会遇到编译错误。
- 您的主项目现在应该(希望)构建。
我真的不喜欢步骤 8 和 9。这真的感觉 XCode 没有做它所宣传的那样。但是,如果问题得到解决,至少这些步骤很容易取消,以便它可以正常工作。
我认为“隐式依赖”应该不需要经过第 6 步,甚至可能第 5 步就可以工作,但这对于很多人的口味来说可能有点太神奇了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)