在Xcode4使用开源的静态库

Xcode的4.0.1使我们能够更容易地创建和使用在iOS项目的第三方库。但是我觉得这个过程仍然是很复杂的,它需要说明。 Xcode的文件表明,它会自动检测隐式依赖关系和工作区之间的指数类,但我还没有发现这是此案。在这里,我将介绍我发现项目之间以及与其他开发人员的代码,用于创建和共享的步骤。

  1. 背景
  2. 如何静态库
  3. 创建一个静态库
  4. 未来的改进
背景

工作区:

Xcode的4引入了多个项目的容器的工作区的概念。有许多组合选择如何共享整个项目的代码时我们所要建设的工作区,其中的关键行为。

默认情况下,一个工作区中的所有Xcode项目建在同一目录中,统称为工作区建立目录。
Xcode的构建目录中的文件检查,发现隐式依赖。
在工作区中的每个项目,继续拥有自己独立的身份。

计划:

在工作区,或在一个项目中,这是我们有计划的工作区的成员。计划取代的活动目标,构建的Xcode3的配置,并可执行设置和定义目标,以建立,建立的顺序,以及采取何种行动时构建完成。我们想要我们的共享代码轻松地安装到使用它的任何项目的计划。在Xcode4过渡指南涵盖这更详细的新结构。

 
 目标:

在计划中,我们有一个或多个建设目标,定义一个源文件的建立,用来建立这些文件的设置,和任何其他目标必须完成的第一批产品依赖。最终,我们希望我们的代码的消费者能状态,他们的项目的建设目标,取决于我们共享代码和Xcode中建立这个共享代码,使其可积极构建目标。我们可以通过提供一个项目,其中包含要共享的代码和静态库建设的目标,包到构建产品其他开发人员可以添加作为构建目标依赖。

使用静态库
  • 创建工作区将项目添加到一个工作区
  • 新增建设目标的依赖关系
  • 添加静态库的头
  • 配置项目的计划
  • 固定索引


    创建工作区

    从Xcode的文件菜单中,我们可以创建一个新的空工作区,或打开一个现有项目,并选择“另存为工作区... ...”创建一个新的工作区包含我们的项目。这将创建一个“。xcworkspace”包中的文件系统。

    An empty Xcode 4 workspace
    一个空的Xcode4工作区
 将项目添加到一个工作区

一旦我们有一个工作区,我们可以在工作区的Navigator中,右键单击创建一个新的项目,或增加现有的“。xcodeproj”包。
Adding a new project to a workspace

添加一个新的项目工作区

Adding an existing project to a workspace

我们要结束与一个单一的包含任何静态库,我们都将依赖于我们的应用程序的项目和项目的工作区。值得注意的是,这些项目都是在工作区中的所有兄弟姐妹,我们的静态库没有增加一条,作为我们的应用程序的项目中的引用。


新增建设目标的依赖关系

所有的项目,我们需要在我们的工作区,我们可以选择我们的应用程序的构建目标,并添加一个静态库“链接的二进制库”建设阶段。

Libraries and frameworks available to add to the "Link Binary With Libraries" build phase
添加“与库的链接二进制库和框架”构建阶段

A static library added to the "Link Binary With Libraries" build phase
静态库添加到“链接二进制使用库”建设阶段

 
 
添加静态库的头

我们还需要确保我们的应用程序的构建目标可以找到这个静态库中使用的公共头。打开“生成设置”选项卡,找到“用户头搜索路径”设置。设置这个“$(BUILT_PRODUCTS_DIR)”(或“$(BUILT_PRODUCTS_DIR)/static_library_name”如果我们要更具体,但我们将更新此设置我们每次添加另一个库),并检查“递归”检查框。现在,我们建的目标将搜索共享我们的工作区的建立目录找到可连接的头文件。

Setting the User Header Search Paths
设置用户头搜索路径

User Header Search Paths set
用户头搜索路径设置

“用户头搜索路径”设置定义所报的进口(例如“#进口”MyLibraryClass.h“)的头,而”页眉搜索路径“设置为括号内的进口(如可用”#import)与这些头文件定义。我发现的Xcode将只在引用的形式自动完成的头名,所以我总是添加库用户头文件搜索路径,即使从我的项目的角度来看,他们可能更系统级(角括号内的)库。

当使用静态库,其中包括类别,我们也将添加“ObjC”标志,以“其他链接程序标志”构建设置。这将强制链接器从库中加载所有的Objective - C类和类别。如果库中包含只类别“all_load”或“force_load”,以及可能需要。参见技术问答QA1490这些设置的更详细的解释。

 
 配置项目的计划

Xcode中应在这一点上已发现这我们的应用程序的项目和静态库的项目之间的隐式依赖,并有自动配置我们的计划,正确。不幸的是,我没有发现这是在实践中的情况。相反,我们将不得不修改我们目前的计划,并添加静态库的建设目标之前,我们的应用程序的构建目标。

Setting the scheme's target build order
设置该计划的目标构建顺序


固定索引

在这一点上,我们应该可以包括从依赖静态库的头,使用类,仍然成功地构建我们的应用程序。不幸的Xcode将不显示尽管工作区的文件指出,从这些链接的静态库在代码完成的任何类“索引是在整个工作区,延长了内容感知的功能,如代码完成和重构范围。”
作为一种变通方法,我们可以从静态库的项目拖动到我们的应用程序的项目的公共头,增加他们作为参考。这些头文件不需要被包括在我们的建设目标,只需在我们的项目的头,将允许他们班出现在代码完成。


创建一个静态库

如果我们计划发布一些我们自己的代码重用作为一个静态库,有几件事情我们应该做的,以确保上述过程是容易的,我们图书馆的用户尽可能简单。

命名空间的类适当
创建一个构建目标
公开的公​​共头
设置安装目录
设置的公共头路径
排除从VCS用户的特定文件

命名空间的类适当

使用类,协议,功能,和库中的常数,在图书馆的用户的项目名称,以防止碰撞的适当的前缀。

创建一个构建目标

在为我们的用户链接项目提供一个静态库的构建目标。 Xcode提供的模板创建静态库的项目,或加入静态库的建立对现有项目的目标。

公开的公​​共头

确定头文件库的用户应该是可见的。提供一个明确的命名组包含这些头文件,使我们的图书馆的用户可以轻松地找到他们作为“修复索引”上面所描述的解决方法的一部分。这也有助于我们澄清我们的图书馆提供的公共接口是什么,什么类的实施细则,有可能改变作为图书馆的发展。

对于每一个公共头文件,确保它设置为“公”,在“目标会员”督察窗格。只有公共头将要为我们的用户导入提供。

Making a header file public
制作一个头文件中的公共


设置安装目录

我们的静态库建设的目标将是一个用户的工作区的成员,该工作区的安装规则。因此,我们建立产品的静态库可安装在Xcode的喜好设置位置,路径中得出的数据,或通过我们的建设目标指定的路径。由于我们无法控制用户的设置,我们应该确保我们的图书馆是在所有情况下的表现。我设置的“安装目录”设置为“$(BUILT_PRODUCTS_DIR)”建立使静态库构建的产品,可以在发现一个已知的位置,并设置“跳过安装”建立设置为“Yes”,以避免意外安装的iOS库在“/ usr /本地/库”。

Setting the installation directory
设置安装目录


设置的公共头路径

我们需要指定一个位置复制静态库的公共头,使他们可以在我们的用户包括头搜索路径。设置“公共页眉文件夹路径”,“$(TARGET_NAME)”将创建一个文件夹后,我们的静态库命名为构建目标在共享工作区的建立目录和索引“用户头搜索路径”设置上面所述。

Setting the public headers path for the static library
设置为静态库的公共头文件路径


排除从VCS用户的特定文件

我们的工作区和项目,包括一些有关我们的用户帐户只包含数据的文件,窗口位置,打开的文件,等等。有没有必要检查到源代码控制这些,至少不会在我们的发行版分支,所以让我们使用GIT或任何VCS设置一些合理的忽略规则。 Github上提供了一个方便的设置。gitignore文件

未来的改进

希望的Xcode 4最终将不辜负它的文档的承诺,并一贯自动检测整个工作区的隐式依赖关系和索引文件正确。当然,似乎这种行为作斗争的其他开发人员的数量:[1],[2],[3] [4] [5] [6] [7] [8]。在此之前,索引的改善,我觉得这个过程至少在某种程度上是不是试图维持在Xcode 3模拟器和设备兼容的静态库构建简单和清洁。
我发现这种模式最好直接复制到我的项目的第三方类,因为它使我可以轻松地保持版本的历史,使我的工作区中的静态库项目的更新和避免太密切合作,以私人的结构和内容耦合我的项目静态库。
请让我知道如果你可以看到这种模式可以改善,或者如果你发现你自己的选择意味着共享代码的任何地区。
 
posted @ 2011-12-13 16:24  程序是啥  阅读(2864)  评论(0)    收藏  举报