【转自:http://www.cocoachina.com/macdev/cocoa/2010/0120/347.html】

  对于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也可能大不相同.
    我们来举几个典型的应用多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". 那么在程序中就可以用 
    #if defined(LITE_VERSION) 
    #else 
    #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

转载于:https://www.cnblogs.com/zhulin/archive/2012/09/04/2669785.html

xCode中工程相关的一些处理:一个工程包含多个Target的用途和使用方法【转】...相关推荐

  1. Xcode中指令集相关选项

    Xcode中指令集相关选项(Build Setting中) (1)Architectures Space-separated list of identifiers. Specifies the ar ...

  2. 桥梁工程相关c语言程序,桥梁工程监理问题及措施论文

    桥梁工程监理问题及措施论文 摘要:对桥梁工程监理的基本内容进行了介绍,总结了桥梁工程监理面临的问题,主要表现在市场行为和监理人员的从业行为缺乏规范性.现场管理落实不到位等,因此,从加强监理人员的培训. ...

  3. 在Xcode 中如何打包测试版 给测试工程师使用

    在Xcode 中如何打包测试版 给测试工程师使用 1>创建发布证书: iOS distrution cer 2>创建测试描述文件: AdHoc provisioning file 测试描述 ...

  4. 用ccs创建一个工程文件

    1.运行ccs5.2,打开ccs工作界面. 2.右键点击菜单栏中的project,选择新建一个工程. 3.在Project栏内填写工程名字:hello.设置工程存储路径,确认没有问题后点击Finish ...

  5. Xcode中的Target基本使用详解

    Target简介 多个Target的使用场景 Target的使用 使用Xcode创建工程时默认的设备是iPhone,并且默认选中Include Unit Tests(单元测试)和Include UI ...

  6. ChatGPT中文版Prompt提示工程超详细指南《提示工程简介及示例》Github最新破万星项目Meta AI前工程师解密百万年薪提示工程师GPT-4模型优化利器(一)

    提示工程简介及示例 前言 Introduction 导言 提示工程简介 什么是提示工程 大语言模型设置 基础提示词 提示词格式 提示词要素 设计提示的通用技巧 从简单开始 指令 具体性 避免不精确 做 ...

  7. matlab中创建一个工程,从文件夹创建新工程

    从文件夹创建新工程 如果您有许多文件并希望将它们整理为一个工程(无论是否进行源代码管理),请按照以下步骤创建一个新工程. 使用 Simulink® Start Page 中的 Folder to Pr ...

  8. 使用keil5中的RL_TCPNet中间件建立一个工程

    前言 RL_TCPnet也算是一个比较有名的小型协议栈,相比于LwIP,它支持非常多的应用协议.并且这是ARM自家出的中间件,专门针对自家内核做过优化,性能强劲.所以学一下它非常有必要.这次搞以太网算 ...

  9. xcode 新建java项目_Objective-C入门教程01:使用Xcode新建一个工程

    Xcode 是 Apple 的集成开发环境(就像开发Java使用Eclipse一样),用于 iOS 和 Mac OS X 的开发.Xcode可以直接在App Store中安装.在 Mac 上安装 Xc ...

最新文章

  1. DUILib 中的通知事件
  2. [BZOJ1322]Destroying The Graph
  3. boost::interprocess::anonymous_shared_memory用法的测试程序
  4. python局部变量含义_Python的变量
  5. 计算机管理员相关知识,计算机管理员述职报告范文
  6. anaconda安装keras_一定要看的Tensorflow-GPU+Keras安装教程
  7. BackToTop.js 为你的网站添加“回到顶部”按钮
  8. 关于形而上学与形而下学之区别及关系
  9. 【总结整理】高德LBS开放平台学习
  10. activities工作流入门笔记-001-建表
  11. htcm7刷linux,htc one m7刷官方zip包的教程
  12. 同事的你--写给那些离职的同事们
  13. Hive SQL复杂场景实现(1) —— 连续发单天数
  14. XML的优势及应用领域
  15. PDF中在指定位置插入图片
  16. 多米诺红光管激光机,为覆膜纸盒、药盒提供完美不起泡的标识打码解决方
  17. 计算机老师新年贺卡祝福语,新年贺卡祝老师祝福语精选
  18. 机器学习--主成分分析PCA算法:为什么去均值以后的高维矩阵乘以其协方差矩阵的特征向量矩阵就是“投影”?
  19. ZZULIOJ-1107: 回文数猜想(函数专题)(Java)
  20. 【Python】Conway生命游戏学习

热门文章

  1. 用Visual Studio开发以太坊智能合约
  2. Linux学习总结(3)——Linux实用工具
  3. Drupal中的分类(Taxonomy)用法 (转)
  4. 在SQLMAP中使用动态SQL
  5. 想要升职加薪?先管理好时间与目标!
  6. 中兴交换机查看光纤板支持的类型
  7. ASP.NET Core 1.0 使用 MySQL for EF Core 1.0 (.NET Core 1.0)
  8. QPainterPath 不规则提示框(二)
  9. 【转载】CentsOS系统inotify实时监控服务器文件(夹)定制事件处理程序
  10. asterisk源码目录结构