上一章Objective-C开发教程请查看:Objective-C程序结构和项目结构介绍
上一章中我们介绍了OC编程的基本程序结构,以及一些基本的项目结构,以及相关配置,关于配置相关的信息可以查看上一章教程,本节假设你已经对OC项目的基本配置已经有所理解。
首先我们最基本应该清楚什么是project,也就是项目或工程,一个project基本包含我们编写的代码文件以及相关的资源如图片等。另外一个就是product产品,也就是程序最终生成的目标文件,如果是命令行项目就是一个可执行文件,如果是iOS项目就是一个APP了,下面先给出一个图结合进行理解
从最简单的项目讲起
从没有IDE的情况讲起:如果我们的项目只有一个文件,那么只需要使用编译器命令(GCC或Clang)直接编译即可,当文件开始增加时,那么我们只需要编译时增加相应的文件即可,另外如果文件存在依赖关系,那么我们可能需要分开编译。而且项目文件可能会越来越多,依赖也越来越复杂,再说每次编写文件都要输入命令编译一次,那得多累。
所以这时我们不如使用一个配置文件,配置相关的编译以及相关依赖,然后一次性编译,于是就有了配置文件,以及实现一次性编译的工具:构建工具,UNIX下编程这个配置文件叫做Makefile,构建工具叫做make(还有其它make工具,主要是负责调用编译器编译文件)。后来其它开发都沿用了这个习惯。
OC项目也有这个概念的,build就是构建的意思,build settings就是对当前项目的编译进行配置,例如以release方式还是以debug进行构建,是否需要配置一些编译选项,参数,指定第三方依赖或本地依赖,对平台参数的指定等等,这一步其实就是对编译进行设置(如果不用配置文件,那编译一个项目的工作量可是相当大)。
话又说回来,如果我们想构建不同版本的product呢?例如一个付费一个免费版本,解决办法是指定两种构建方式,这个就是target了,例如可以指定一个开发的target和生产环境的target,iOS中还有test类的target。
其中每个target都带有项目资源的引用,以及相关的构建配置,在OC项目中,有两种build settings,一种是全局项目级别的build settings,另一种是target自身的配置,默认target和项目级别的配置是相同的。
而scheme就是包含多个target的东西了,另外还包含相关的test。
说回到依赖,如果我们想自己创建一个模块用于主app呢?这就是两个OC项目了,多个OC项目就构成了一个workspace,在workspace中可以解决依赖自定义模块的问题。
好了,到这里你应该对这几个东西有了个不错的了解了吧,下面我们详细介绍Xcode Target、Scheme、Build Settings、Porject和Workspace。
Xcode Target
target用于指定要构建的产品product,并且包含对当前工作空间或项目相关文件的说明或配置。一个target只对应构建一个产品,它将项目的相关文件组织输入到构建系统中,也就是构建产品所需的文件,以及处理这些文件的配置说明,一个项目可以包含多个target。
构建产品的配置说明,使用Build Settings和Build Phases的形式,你可以在这里进行配置,默认target继承自project的配置,你可以手动更改覆盖默认值。使用target需要在scheme中使用,可以在这里找到scheme:
另外一个target可以依赖于另一个target,如果两个target都在同一个workspace,Xcode可以自动发现依赖,并首先构建依赖项,这种依赖称为隐式依赖。另一种是显式依赖:通过在Build Phases中的第一项进行显式添加target,这样Xcode会使用该依赖覆盖隐式依赖,特别是当你的workspace中有一个模块A,但是如果你想用A的其它版本Ac,则可以在Build Phases中指定Ac,这样可以覆盖隐式依赖。
但是要注意,如果依赖本地子模块(静态库),发现添加target是不行的,需要在Build Phases中的Link Binary with libraries添加静态库(当然还要导入头文件)。
Xcode Scheme
Xcode scheme定义了要构建的target的集合,构建时要使用的配置以及要执行的测试的集合。
我们可以根据需要选择任意多个scheme,但是一次只能激活一个,你可以指定scheme在project中使用还是在workspace中使用, 选择活动scheme时,还要选择运行target(即为其构建产品的硬件的体系结构),如果你创建多个target又不在scheme中指定的话,那构建的就不是目标的product了。
Xcode Build Settings
Build Settings(构建设置)置是一个变量,其中包含有关应如何执行产品构建过程的特定方面的信息。例如,Build Settings中的信息可以指定Xcode将哪些选项传递给编译器。
你可以在项目或target级别指定构建设置。每个项目级别的Build Settings都适用于项目中的所有target,除非被特定target的Build Settings明确覆盖。
每个target都组织构建一个产品所需的源文件。Build Settings指定一组用于以特定方式构建目标产品的构建设置。例如,通常有用于调试和发布产品的单独的构建配置。
Xcode中的构建设置包括两部分:设置标题和定义。标题标识构建设置,并且可以在其他设置中使用。定义是一个常量或Xcode在构建时用于确定构建设置值的表达式。构建设置还可以具有显示名称,该显示名称用于在Xcode用户界面中显示构建设置。
从项目模板创建新项目时,除了Xcode提供的默认构建设置外,你还可以为项目或特定target创建用户定义的构建设置。你还可以指定条件构建设置。有条件的构建设置的值取决于是否满足一个或多个先决条件。例如,此机制使你可以根据目标体系结构指定用于构建产品的SDK。
Xcode Porject
Xcode Project(项目)是构建一个或多个软件产品所需的所有文件,资源和信息的存储库。项目包含用于构建产品的所有元素,并维护这些元素之间的关系。它包含一个或多个target,用于指定如何构建产品。项目为项目中的所有target定义默认的构建设置build setting(每个target也可以指定自己的构建设置,这些设置将覆盖项目级别的构建设置build setting)。
Xcode项目文件包含以下信息:
1、对源文件的引用:
- 源代码,包括头文件和实现文件
- 内部和外部的库和框架
- 资源文件
- 图片文件
- 界面生成器(nib)文件
2、用于在项目结构导航器中组织源文件的组
3、项目基本build settings构建配置。你可以为一个项目指定多个构建配置。例如,你可以创建具有调试和发布项目的构建设置的功能。
4、target,其中每个target都指定:
- 对项目构建一种产品的引用
- 对构建该产品所需的源文件的引用
- 可用于构建该产品的构建配置,包括对其他target和其他设置的依赖;当target的构建配置未覆盖它们时,将使用项目级别的构建设置
5、可用于调试或测试程序的可执行环境,其中每个可执行环境都指定:
- 从Xcode运行或调试时要启动的可执行文件
- 要传递给可执行文件的命令行参数(如果有)
- 程序运行时要设置的环境变量(如果有)
项目可以独立存在,也可以包含在工作空间中。
你可以使用Xcode scheme来指定在给定时间处于活动状态的target、构建配置和可执行文件配置。
Xcode Workspace
上面的截图就是一个workspace(工作空间),一个workspace可以包含一个或多个oc项目,上面的截图包含了一个module子项目,用在模块。
workspace是将project和其他文档分组的Xcode文档,因此你可以一起使用它们。workspace可以包含任意数量的Xcode项目,以及你想要包含的任何其他文件。除了组织每个Xcode项目中的所有文件之外,workspace还提供了包含的项目及其目标之间的隐式和显式依赖关系。
workspace扩展了工作流程的范围
项目文件包含指向项目中所有文件的指针,以及构建配置和其他项目信息。在Xcode 4及更高版本中,你可以选择创建一个工作区来容纳一个或多个项目,以及要包含的任何其他文件。
除了提供对每个包含的Xcode项目中所有文件的访问权限之外,workspace还扩展了许多重要Xcode工作流程的范围。例如,由于索引是在整个工作空间中完成的,因此代码完成,跳转到定义以及所有其他内容感知功能都可以在工作空间中的所有项目中无缝运行。由于重构操作作用于工作空间的所有内容,因此你可以在一个框架项目中以及在一个使用该框架的多个应用程序项目中重构API。在构建时,一个项目可以利用工作空间中其他项目的产品。
工作区文档包含指向所包含的项目和其他文件的指针,但没有其他数据。
workspace中的项目共享构建目录
默认情况下,workspace中的所有Xcode项目都在同一目录中构建,称为workspace构建目录。每个workspace都有其自己的构建目录。因为工作空间中所有项目中的所有文件都在同一构建目录中,所以每个项目都可以看到所有这些文件。因此,如果两个或多个项目使用相同的库,则无需将它们分别复制到每个项目文件夹中。
Xcode检查构建目录中的文件以发现隐式依赖性。例如,如果workspace中包含的一个项目构建了由同一工作空间中的另一个项目链接的库,则Xcode会在构建另一个项目之前自动构建该库,即使构建配置没有使此依赖关系明确。如有必要,可以使用显式构建设置覆盖此类隐式依赖性。对于显式依赖项,必须创建项目引用。
工作区中的每个项目都将继续拥有自己的独立身份。要在不影响或不受工作空间中的其他项目影响的情况下处理项目,可以在不打开工作空间的情况下打开该项目,也可以将项目添加到另一个工作空间。由于一个项目可以属于多个工作空间,因此你可以以多种组合方式处理项目,而不必重新配置任何项目或工作空间。
你可以使用workspace的默认构建目录,也可以指定一个。请注意,如果项目指定了构建目录,那么在构建项目时,该目录将被该项目所在的任何工作区的构建目录所覆盖。
小结
以上我们介绍了Xcode Target、Scheme、Build Settings、Porject和Workspace,其中:
- Target指定构建的产品,每个target对应于一种产品,可以根据需要自行创建target。target中包含完整的build settings,默认继承项目基本的build settings,可手动覆盖。
- Scheme指定当前使用的构建方案,也就是说构建工具是直接拿一个激活了的scheme来用,每个scheme里面包含了使用的target、运行参数指定、编译参数、清理等。
- Build Settings保证完整的构建配置,其中涉及平台的配置、项目编译的配置、编译器的配置等等(可以花点时间看一下)。另外还有Build Phases构建阶段,这里一般包含target依赖的指定,第三方库的指定,项目源码的指定以及复制项目资源(用于将项目除源码文件之外的文件打包进目标app)。
- Project就是一个资源仓库,包含一个项目的所有内容,一个项目可以依赖另一个项目,这个概念作为编程应该都比较熟悉了。
- Workspace就是工作空间了,一个工作空间内可以包含一个或多个project,默认创建项目工作空间的名字和project的名称是相同的。
以上内容有一些是参考Apple开发文档的,大体说清楚了Xcode的这几个基本概念,这几个对我们的开发比较有用,例如添加第三方库或本地子模块,或是出现其它错误或警告。
题外说一下如何添加第三方库和本地模块:首先OC是C语言的超集,在C语言中也有头文件声明,头文件的作用可以看作是用作编译检查,也就是看有没有这样的标识符,有就通过编译(在链接阶段根据这些进行链接)。一般编译语言如C会在链接阶段检查是否有头文件声明对应的实现,OC则是在运行时动态检查。
也就是说使用第三方库和本地模块首先需要提供头文件声明:这个需要在build settings中的header serach paths(头文件搜索路径)添加,另外需要添加二进制实现文件(动态库.dylib或静态库.a):这个在build phases中的link binary with libraries中添加。
评论前必须登录!
注册