我有一个自定义框架,遵循Apple的框架编程指南中的建议>> Installing your framework我在/ Library / Frameworks中安装。我通过使用以下脚本添加运行脚本构建阶段来完成此操作:
cp -R build/Debug/MyFramework.framework /Library/Frameworks
在我的项目中,我然后链接/ Library / Frameworks / MyFramework并将其导入我的类中,如下所示:
#import <MyFramework/MyFramework.h>
这很有效,除了我总是在调试器控制台中看到以下消息:
显然,编译器首先查看/ Users / elisevanlooij / Library / Frameworks,找不到MyFramework,然后查看/ Library / Frameworks,找到MyFramework并继续其快乐的方式。到目前为止,这更像是一个烦恼而不是真正的问题,但是当运行单元测试时,gdb停止(文件未找到)并拒绝继续。我通过在Run Script Phase中添加一行来解决这个问题将程序加载到调试器中...... sharedlibrary apply-load-rules all 警告:无法读取“/Users/elisevanlooij/Library/Frameworks/MyFramework.framework/Versions/A/MyFramework”(未找到文件)的符号。 警告:无法读取“MyFramework”中的符号(尚未映射到内存中)。 程序已加载。
cp -R build/Debug/MyFramework.framework ~/Library/Frameworks
但感觉就像是在拍摄一些不应该被打破的东西。我该如何解决这个问题?
答案 0 :(得分:12)
在过去的几个月里,我学到了很多关于框架的知识,所以我正在重写这个答案。请注意,我所说的是在开发工作流程中安装框架。
安装公共框架(即将由多个应用程序或软件包使用的框架)的首选位置是/ Library / Frameworks [链接文本],因为“此位置的框架是由编译器自动发现的在编译时和运行时的动态链接器。“[框架编程指南]。最优雅的方法是在Build设置的Deployment部分。
当您使用框架时,有时您确实希望在执行构建时更新框架,而有时则不希望更新框架。因此,我仅在发布配置中更改部署设置。所以:
部署位置=是(单击复选框)
安装构建产品位置= /
安装目录= / Library / Frameworks
Installation Build Products Location用作安装的根目录。它的默认值是某个/ tmp目录:如果不将其更改为系统根目录,则永远不会看到已安装的框架,因为它隐藏在/ tmp中。
现在,您可以在调试配置中按照自己的意愿处理框架而不会破坏其他项目,当您准备发布所有需要做的事情时,请切换到Release并执行构建。
Xcode 4警告 自从切换到Xcode 4后,我的自定义框架遇到了很多问题。大多数情况下,他们将GDB中的警告链接起来,这些警告并没有真正干扰框架的有用性,除非在运行内置单元测试时。我在一周前向Apple提交了技术支持票,他们仍在调查。当我得到一个有效的解决方案时,我会更新这个答案,因为这个问题已经证明非常受欢迎(1 kViews和计数)。
答案 1 :(得分:3)
没有太多理由将框架放入库/框架中,这需要做很多工作:您需要在安装程序包中为用户执行此操作,这对创建和维护来说是一个巨大的麻烦,或者您的应用程序中有安装代码(只能安装到〜/ L / F,除非您花费时间和精力使您的应用程序能够以root权限安装到/ L / F)。
更为常见的是what Apple calls a “private framework”。您将把它捆绑到您的应用程序包中。
即使是供任何应用程序(例如Sparkle,Growl)普遍使用的框架,实际上也可以构建为用作私有框架,只是因为将“框架”的单个副本安装到库/的“正确”方式框架是如此麻烦。
答案 2 :(得分:3)
执行此操作的传统方法是让您的框架项目及其客户端共享一个公共构建目录。 Xcode将在任何其他位置之前搜索框架标头并链接到构建文件夹 first 中的框架二进制文件。因此,编译和链接标题的应用程序项目将获取最近构建的一个,而不是安装的任何内容。
然后,您可以删除cp -r,而是使用安装位置构建设置将构建产品放在最终位置,在命令行使用xcodebuild install DSTROOT = /。但是,只有在完成时才需要这样做,而不是每次重建框架时都这样做。
答案 3 :(得分:0)
当然,当您分发框架时,它应该安装在/ Library / Frameworks中;但是,对于我来说,使用框架的测试/调试版本来做这件事似乎很奇怪。
我的第一直觉是在〜/ Library下安装测试版本,因为它只是简化了设置测试和调试环境。如果可能的话,我希望调试/测试框架位于我正在测试的版本的构建树中,在这种情况下,它被安装为Private Framework用于测试目的。当处理框架的多个版本时,这将使您的生活变得更加简单。
最终,只要您的应用程序或测试套件加载正确的版本,框架的位置无关紧要。选择最容易进行测试/调试/开发的位置。