7

我有一个自定义框架,按照 Apple 的框架编程指南 >>安装我安装在 /Library/Frameworks 中的框架中的建议。我通过使用以下脚本添加运行脚本构建阶段来做到这一点:

cp -R  build/Debug/MyFramework.framework /Library/Frameworks

然后在我的项目中链接 /Library/Frameworks/MyFramework 并将其导入我的类中,如下所示:

#import <MyFramework/MyFramework.h>

这很好用,除了我总是在调试器控制台中看到以下消息:

正在将程序加载到调试器中... sharedlibrary apply-load-rules all 警告:无法读取“/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework”的符号(找不到文件)。警告:无法从“MyFramework”中读取符号(尚未映射到内存中)。程序已加载。

显然,编译器首先在 /Users/elisevanlooij/Library/Frameworks 中查找,找不到 MyFramework,然后在 /Library/Frameworks 中查找,确实找到了 MyFramework 并继续其愉快的方式。到目前为止,这更像是一个烦恼而不是真正的问题,但是在运行单元测试时,gdb 会在(找不到文件)上停止并拒绝继续。我通过在运行脚本阶段添加额外的行解决了这个问题

cp -R  build/Debug/MyFramework.framework ~/Library/Frameworks

但感觉就像是在卖一开始就不应该打破的东西。我怎样才能解决这个问题?

4

4 回答 4

12

在过去的几个月里,我学到了更多关于框架的知识,所以我正在重写这个答案。请注意,我说的是作为开发工作流程的一部分安装框架

安装公共框架(即,将由多个应用程序或捆绑包使用的框架)的首选位置是 /Library/Frameworks[link text],因为“此位置的框架由编译器在编译时自动发现以及运行时的动态链接器。”[框架编程指南]。最优雅的方法是在构建设置的部署部分。

当您在框架上工作时,有时您确实想在构建时更新框架,有时又不想。出于这个原因,我只在发布配置中更改部署设置。所以:

  1. 双击框架目标以打开目标信息窗口并切换到构建选项卡。
  2. 在配置选择框中选择发布。
  3. 向下滚动到部署部分并输入以下值:

部署位置 = YES(单击复选框)

安装构建产品位置 = /

安装目录 = /Library/Frameworks

Installation Build Products Location 作为安装的根目录。它的默认值是某个 /tmp 目录:如果你不将它更改为系统根目录,你将永远看不到你安装的框架,因为它隐藏在 /tmp 中。

现在,您可以在 Debug 配置中随心所欲地处理您的框架,而不会打扰您的其他项目,当您准备好发布时,您需要做的就是切换到 Release 并进行 Build。

Xcode 4 警告 自从切换到 Xcode 4 后,我的自定义框架遇到了许多问题。大多数情况下,它们链接 GDB 中的警告,这些警告不会真正干扰框架的有用性,除非在运行内置单元测试时。一周前我已经向 Apple 提交了技术支持票,他们仍在调查中。当我得到一个可行的解决方案时,我会更新这个答案,因为这个问题已经证明很受欢迎(1 kViews 和计数)。

于 2009-11-06T21:48:27.643 回答
3
于 2009-11-04T23:19:03.907 回答
3

执行此操作的常规方法是让您的框架项目及其客户端共享一个公共构建目录。Xcode 将首先在构建文件夹中搜索框架头文件并链接到框架二进制文件,然后是任何其他位置。因此,编译和链接到标题的应用程序项目将选择最近构建的项目,而不是安装的任何项目。

然后,您可以删除 cp -r 并使用 Install Location 构建设置将构建产品放置在最终位置,在命令行中使用 xcodebuild install DSTROOT=/。但是您只需要在完成后执行此操作,而不是每次重新构建框架时执行此操作。

于 2009-11-05T07:31:29.797 回答
0

自然,当您分发框架时,它应该安装在 /Library/Frameworks 中;但是,对我来说,您使用框架的测试/调试版本这样做似乎很奇怪。

我的第一直觉是在 ~/Library 下安装测试版本,因为它只是让设置测试和调试环境变得更加简单。如果可能的话,我希望调试/测试框架位于我正在测试的版本的构建树中,在这种情况下,它将作为私有框架安装以进行测试。当需要处理框架的多个版本时,这将使您的生活变得更加简单。

最终,只要您的应用程序或测试套件加载正确的版本,框架的位置并不重要。选择使测试/调试/开发最容易的位置。

于 2009-11-04T20:18:46.103 回答