代码之家  ›  专栏  ›  技术社区  ›  Elise van Looij

安装自定义Cocoa框架的最佳方法

  •  7
  • Elise van Looij  · 技术社区  · 15 年前

    我有一个定制框架,遵循苹果框架编程指南中的建议>> 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.framework/versions/a/myframework”的符号(找不到文件)。 警告:无法从“MyFramework”中读取符号(尚未映射到内存中)。 程序已加载。

    显然,编译器首先在/users/elisevanlooij/library/frameworks中查找,找不到myframework,然后在/library/frameworks中查找,确实找到了myframework,并以其愉快的方式继续。到目前为止,这比真正的问题更麻烦,但是当运行单元测试时,gdb停止(找不到文件)并拒绝继续。我已经通过在运行脚本阶段添加一行代码解决了这个问题。

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

    但感觉就像是Sello在录制一开始就不应该被打破的东西。我怎么修这个?

    4 回复  |  直到 14 年前
        1
  •  11
  •   Elise van Looij    14 年前

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

    安装公共框架(即将由多个应用程序或捆绑包使用的框架)的首选位置是/library/frameworks[link text],因为“编译时编译器自动发现此位置的框架,运行时动态链接器自动发现此位置的框架。”[framework programming guide]。要做到这一点,最优雅的方法是在构建设置的部署部分。

    当您在您的框架上工作时,有时您在进行构建时确实希望更新框架,有时不希望更新框架。因此,我只在发布配置中更改部署设置。所以:

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

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

    安装构建产品位置=/

    安装目录=/library/frameworks

    安装构建产品位置是安装的根。它的默认值是some/tmp目录:如果不将其更改为系统根目录,则永远不会看到已安装的框架,因为它隐藏在/tmp中。

    现在,您可以在调试配置中按照自己的喜好使用框架,而不必扰乱其他项目,当您准备好发布时,您所需要做的就是切换到发布并执行构建。

    XCODEL 4警告 自从切换到Xcode4之后,我的定制框架遇到了很多问题。大多数情况下,它们都在链接gdb中的警告,这些警告不会真正干扰框架的有用性,除非运行内置单元测试。一周前我向苹果提交了一张技术支持票,但他们仍在调查。当我得到一个有效的解决方案时,我会更新这个答案,因为这个问题已经被证明非常流行(1 kview和counting)。

        2
  •  3
  •   Peter Hosey    15 年前

    没有太多的理由把一个框架放到库/框架中,这是很多工作:你需要在一个安装包中为用户做这件事,这对于创建和维护来说是一个巨大的麻烦,或者在你的应用程序中有安装代码(它只能安装到~/l/f,除非你花费了制作你的应用程序所需的时间和精力能够安装到/L/F,具有根电源)。

    更常见的是 what Apple calls a “private framework” . 您将把它打包到应用程序包中。

    实际上,即使任何应用程序(如Sparkle、Growl)打算通用的框架都是为用作私有框架而构建的,这仅仅是因为将框架的一个副本安装到库/框架的正确方法非常麻烦。

        3
  •  3
  •   cdespinosa Martin Cote    15 年前

    传统的方法是让框架项目及其客户机共享一个公共的构建目录。Xcode将在build文件夹中搜索框架头文件并针对框架二进制文件进行链接。 第一 ,在任何其他位置之前。因此,一个针对报头编译和链接的应用程序项目将得到最近构建的一个,而不是安装的任何东西。

    然后,您可以删除cp-r,而使用命令行中的xcodebuild install dstroot=/将生成产品放置在最终位置。但是,您只需要在完成之后才需要这样做,而不是每次重建框架时都需要这样做。

        4
  •  0
  •   Darren    15 年前

    当然,当您分发您的框架时,它应该安装在/library/frameworks中;但是在我看来,您使用的是框架的测试/调试版本,这很奇怪。

    我的第一直觉是在~/library下安装测试版本,因为它只会使设置测试和调试环境变得简单得多。如果可能,我希望调试/测试框架位于我正在测试的版本的构建树中,在这种情况下,它作为 Private Framework 用于测试。当涉及到处理框架的多个版本时,这将使您的生活简单得多。

    最终,只要您的应用程序或测试套件加载正确的版本,框架的位置就无关紧要。选择最容易进行测试/调试/开发的位置。

    推荐文章