XCode工程中 Project 和 Targets区别

转自:http://blog.csdn.net/zhaozy55555/article/details/8557175

project就是一个项目,或者说工程,一个project可以对应多个target,比如一个xxx游戏的project,有free版的target,收费版的,或者还有什么节日版,product就是target build出来的一个app

targets之间没一毛钱关系。但target和project有关系,target的setting会从project settings中继承一部分

XCode工程中 Targets讲解是本文要介绍的内容,相信很多人都注意到XCode中, 有个Target的概念. 这在很多地方都有所体现, 比如打开一个工程后, 左侧的列表中有Targets一项, 而在工程界面的顶部菜单中, project里面也有多个涉及到Target的项目, 那么这个Target到底是什么呢?

Apple的人是这样说的:“ Targets that define the products to build. A target organizes the files and instructions needed to build a product into a sequence of build actions that can be taken.”

简单的理解的话, 可以认为一个target对应一个新的product(基于同一份代码的情况下). 但都一份代码了, 弄个新product做啥呢? 折腾这个有意思么?

其实这不是单纯的瞎折腾, 虽然代码是同一份, 但编译设置(比如编译条件), 以及包含的资源文件却可以有很大的差别. 于是即使同一份代码, 产出的product也可能大不相同.

我们来举几个典型的应用多Targets的情况吧, 比如完整版和lite版; 比如同一个游戏的20关, 30关, 50关版; 再或者比如同一个游戏换些资源和名字就当新游戏卖的(喂喂, 你在教些什么...)

Targets之间, 什么相同, 什么不同

既然是利用同一份代码产出不同的product, 那么到底不同Target之间存在着什么样的差异呢?

要解释这个问题, 我们就要来看看一个Target指定了哪些内容.

从XCode左侧的列表中, 我们可以看到一个Target包含了Copy Bundle Resources, Compile Sources, Link Binary With Libraries. 其中

Copy Bundle Resources 是指生成的product的.app内将包含哪些资源文件

Compile Sources 是指将有哪些源代码被编译

Link Binary With Libraries 是指编译过程中会引用哪些库文件

通过Copy Bundle Resources中内容的不同设置, 我们可以让不同的product包含不同的资源, 包括程序的主图标等, 而不是把XCode的工程中列出的资源一股脑的包含进去.

而这还不是一个target所指定的全部内容. 每个target可以使用一个独立, 不同的Info.plist文件.

我们都知道, 这个Info.plist文件内定义了一个iPhone项目的很多关键性内容, 比如程序名称, 最终生成product的全局唯一id等等.
    
而且不同的target还可以定义完整的差异化的编译设置, 从简单的调整优化选项, 到增加条件编译所使用的编译条件, 以至于所使用的base SDK都可以差异化指定.

创建第二个Target

为什么是第二个? 因为第一个就是创建好工程后的默认Target呀! (废话这么多, 拖走...)

创建target有多种方法, 我们可以从现有的target上复制出一份, 然后略加改动, 也可以完全新建一个target出来. 但其实说穿了, 两个方法大同小异

首先我们来看看利用复制的方法创建target

利用复制创建target

我们在XCode左侧的列表中, 展开 Targets 项, 在现有的target上, 右键选择 "Duplicate", 或者选中现有target后, 在顶部菜单的Edit内选择"Duplicate"也可以.

此时我们就得到了一个新的target, 而在Resource里面也会得到一个 xxxx copy.plist. 这个新的target与原有的target是完全一致的, 余下的就是一些差异化的修改, 这个我们后面再说

创建全新的target

类似复制的方法, 我们可以在左侧的列表中很多地方按下右键菜单, 都可以看到Add中会有"New Target..."一项, 而在工程顶部菜单的Project内, 也可以看到这个"New Target..."的身影.

点击后, 首先会让你选择target的类型, 既然我一直所指的都是程序本身, 那么自然选择Application了(至于其他的嘛, 有兴趣的自己研究吧, 比如我们可以把程序中的部分提取成一个Static Library).

Next后, 会让你输入一个新的Target的名字, 而不像复制的方法中, 默认生成 xxxxx copy这样的target名.

但是这样生成出的Target几乎是空的. Copy Bundle Resources, Compile Sources, Link Binary With Libraries里面都没有任何内容. 编译设置也是完全原始的状态.

可以通过拖拽内容到这些target的设置中, 以及调整编译选项来完成Target的配置。

Target中部分内容的修改方法

其实这段的部分内容, 在非多Targets的工程中也可能会用得到.

由于修改基本都是在工程/编译设置中完成, 因此没有特殊情况, 就不再声明了, 打开target对应的工程/编译设置的方法可以采用在该target上右键, 选择get info来做到.

生成的product名称的修改: Packing段内的Product Name一项

Info.plist文件名: Packing段内的Info.plist File一项, 比如复制出来的target觉得那个xxxxx copy.plist太傻就可以在这里改

条 件编译: 增加一个User-Defined Setting(Target "xxxx" Info的build页的左下角那个齿轮中可以看到这个内容), 在Other C Flag里面填入, 比如要定义一个叫做LITE_VERSION的define值, 我们可以写上 "-DLITE_VERSION" 或 "-DLITE_VERSION=1". 那么在程序中就可以用

  1. #if defined(LITE_VERSION)
  2. #else
  3. #endif

这样的条件编译来部分差异化代码了

也许有些朋友记得我在代码区贴过的检测破解版的代码, 其中有一种检测方法就是看info.plist是文本还是二进制的, 那么我们能否建议一个模拟破解的target, 直接生成文本的info.plist以便测试呢?

当然可以, 在packing段内, 有一项叫"Info.plist Output Encoding", 默认值是Binary, 我们只要选成xml, 那么生成出的product.app内的info.plist就直接是文本样式的了.

另外, 向Copy Bundle Resources, Compile Sources, Link Binary With Libraries内添加/删除文件, 可以在要改动的文件上, 选择get info, 并且切换到Target页, 勾选要引用这个文件的target即可. 比如icon.png可以指定给默认target, 而icon_lite.png指定给lite verion的target

时间: 2024-10-14 10:41:58

XCode工程中 Project 和 Targets区别的相关文章

怎么去掉Xcode工程中的某种类型的警告 Implicit conversion loses integer precision: 'NSInteger' (aka 'long') to 'int32

在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢 1.最直接,最一劳永逸,最安全的方式,直接找到警告的那段代码,改为不警告.这个方式,最安全. 可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写的源码,有可能

集成Reveal到你的从Xcode工程中

集成Reveal:将Reveal加入您的Xcode工程 将Reveal加入您的Xcode工程,使得您团队中的其他成员无需任何额外的配置,就可以使用Reveal. 警告: 永远不要将包含Reveal动态库文件的应用正式发布.Apple不允许将含有动态加载库文件的iOS应用发布到Apple商店中. 在Xcode中打开您的iOS工程. 启动Reveal并选择__Help → Show Reveal Library in Finder__,这将会打开Finder窗口,并显示一个名为*iOS-Librar

关于XCode工程中PrefixHead.pch文件的使用

1.首先先清除pch文件在工程中的作用: 存放一些全局的宏(整个项目中都用得上的宏) 用来包含一些全部的头文件(整个项目中都用得上的头文件) 能自动打开或者关闭日志输出功能 2.由于新建的XCode工程文件是没有pch文件的,原因可能是因为大家把大量的头文件和宏定义放到pch里边,导致编译时间过长.苹果去掉他可能是要加快编译时间增加用户体验.虽然失去了编程的便利性. 所以需要我们自己手动新建一个pch文件,步骤如下: Command+N,打开新建文件窗口:ios->other->PCH fil

从XCode添加File的错误Multiple errors occurred while copying the files分析Cocos2d-x在XCode工程中添加文件

1.Multiple errors occurred while copying the files问题 关于这个问题,这里有解决办法 大致的意思是 1)添加文件没有全部添加,但是有部分添加成功,再次以文件夹添加之前的文件时会报这样的错误. 2)解决办法:先clean工程,点击上步需要添加文件的父目录,show  in  finder,删除之前添加的文件,重新添加. 这是一个解决办法,但是出现这样的问题还有另外一个原因: 勾选上了1的选项,导致出现上面的错误,直接去掉就可以了. 2.讲一讲Coc

怎么去掉Xcode工程中的某种类型的警告

问题描述  在我们的项目中,通常使用了大量的第三方代码,这些代码可能很复杂,我们不敢改动他们,可是作者已经停止更新了,当sdk升级或者是编译器升级后,这些遗留的代码可能会出现许许多多的警告,那么我们有没有办法去掉这些烦人的警告,不然一个工程几百个警告,你看着怎么都不爽吧.我们怎么去掉警告呢? 1. 最直接.最一劳永逸.最安全的方式,直接找到警告的那段代码,改为不警告.这个方式最安全. 可是它有一个问题,就是,当我们很多文件都有这种类型的警告的时候,我们就需要改动很多很多的源码了, 对于不是我们写

XCode工程中ARC模式与非ARC模式共用(转)

Xcode 项目中经常会融合一些老的代码,它们可能采用非ARC的模式.混合编译时,就会碰到编译出错的情况. 如何共用ARC模式和非ARC模式呢? XCode除了提供整个项目是否使用ARC模式的选择外,还可以对单个文件添加标签来指定是否采用ARC模式. 添加标签的方法: 打开:你的target -> Build Phases -> Compile Sources. 双击对应的 *.m 文件 在弹出窗口中输入上面提到的标签-fobjc-arc / -fno-objc-arc (1)如果你的项目使用

Git - 忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

一.在同 .Git目录下创建.gitignore文件.在文件中加入如下内容: *.xcuserstate project.xcworkspace xcuserdata UserInterfaceState.xcuserstate project.xcworkspace/ xcuserdata/ UserInterface.xcuserstate 二.退出xcdoe, 打开终端(Terminal),进入项目目录下. 三.在终端键入  git rm --cached [YourProjectName

如何在xcode工程中把lib工程加到主工程联合编译

名词解释:主工程 —— 产品, lib工程 —— 主工程需要引用的库的源代码工程: 1. 如果已经在xcode中打开了lib工程,关闭它,一定要关闭它,否则,后面的步骤都不能正常进行. 2. 在xcode中,打开主工程,打开树形工程目录,把lib工程的 .xcodeproj 拖入. 3. 选择主工程根目录,点击相应的target,选择Build Phases->Target Dependencies->add,把lib工程的target加进去:(这样会告诉主工程,当lib工程变化时,自动编译它

Git关于忽略Xcode工程中UserInterfaceState.xcuserstate文件的问题

1.打开终端(Terminal),进入项目目录下 Last login: Sun Aug 13 13:38:10 on ttys001 xilanglangdeMacBook-Pro:~ xinshaofeng$ cd /Users/xinshaofeng/Work/Found xilanglangdeMacBook-Pro:Found xinshaofeng$ ls Found Podfile README.md Found.xcodeproj Podfile.lock Found.xcwor