XCode4 target deployment target VS .project deployment target

本文详细解析了Xcode工程中的Target概念及其用途,包括Target的定义、区别、配置方法以及如何创建和修改Target。重点阐述了如何利用Target实现同一代码集下产出不同产品,如完整版和Lite版应用,以及如何通过差异化配置实现产品的个性化。

在stackoverflow上发现有人问了同样的问题, 问题及回答如下:

issue

Excuse my ignorance, but what is the difference in Xcode 4 between the Deployment Target field inder "Targets" and the deployment target under "Project"?

What happens if my project deployment target is 3.2, and my IOS Application is 4.0? Or vice versa?


Answer: 

Target settings override project settings. Project settings are valid for all targets whose settings haven't been overridden.


通过这个回答,我们大概可以理解了两者的关系了。


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". 那么在程序中就可以用 

    #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

<think>我们正在处理一个关于"operating system version lower than deployment target"的修复问题。根据用户提供的信息和引用,我们可以推断用户可能遇到了在编译或运行程序时,由于操作系统版本低于程序部署目标(deployment target)而导致的问题。这通常发生在macOS或iOS开发中,但也可以发生在其他系统。 引用[2]中提到GCC版本太低,通过升级GCC解决了问题。这提示我们,有时升级编译器或工具链可以解决此类问题。 然而,用户的问题具体是关于操作系统版本低于部署目标的错误。部署目标(deployment target)是指定应用程序可以运行的最低操作系统版本。如果开发时设置的部署目标高于当前操作系统的版本,那么就会报错。 解决方案通常包括: 1. 升级操作系统:将操作系统升级到部署目标要求的版本或更高。 2. 降低部署目标:修改项目配置,将部署目标设置为当前操作系统版本或更低。 但是,降低部署目标可能会限制使用某些新API,因此需要权衡。 根据上述分析,我们可以给出以下步骤: 步骤1:确认当前操作系统版本 在终端中运行相应的命令来查看当前操作系统版本: - 对于macOS:`sw_vers` - 对于Linux:`lsb_release -a` 或 `cat /etc/os-release` - 对于Windows:`winver` 步骤2:确认项目设置的部署目标 - 对于Xcode项目(iOS/macOS):在项目设置中查看“Deployment Target”设置。 - 对于CMake项目:检查CMakeLists.txt中的相关设置,例如`set(CMAKE_OSX_DEPLOYMENT_TARGET "version")`。 - 其他构建系统:查看构建配置文件(如Makefile, build.gradle等)中关于目标版本的设置。 步骤3:根据情况选择解决方案 - 如果可行,升级操作系统到部署目标要求的版本。 - 或者,修改部署目标设置,使其不高于当前操作系统版本。 步骤4:重新构建项目 修改后,重新构建项目。 此外,引用[3]提到通过增加设备可以线性降低测量成本,这虽然不直接相关,但提示我们有时可以通过增加资源(如使用更高版本的构建机器)来解决问题。 如果用户是在使用跨平台编译工具链(如为高版本系统编译低版本兼容的二进制文件),则可能需要设置正确的部署目标。例如,在macOS上,可以使用`-mmacosx-version-min`标志来指定部署目标。 示例:在编译时指定部署目标(macOS) ```bash gcc -mmacosx-version-min=10.9 your_file.c -o output ``` 对于iOS开发,在Xcode中设置部署目标的位置:Target -> General -> Deployment Info -> Target。 如果用户遇到的是在运行第三方软件时出现的错误,那么可能需要联系软件提供商获取支持,或者升级自己的操作系统。 下面我们将按照要求生成相关问题。</think>### 操作系统版本低于部署目标的修复方法 当出现"operating system version lower than deployment target"错误时,通常表示当前操作系统版本低于应用程序或开发工具要求的最低支持版本。以下是系统性的解决方案: #### 1. **升级操作系统** - **最直接方案**:将操作系统升级到开发工具要求的版本 - **操作步骤**: 1. 检查当前系统版本: ```bash # macOS sw_vers -productVersion # Linux lsb_release -a cat /etc/os-release # Windows winver ``` 2. 访问官方下载渠道获取最新系统安装包 3. 备份数据后执行升级(注意硬件兼容性) #### 2. **调整部署目标设置** - **适用场景**:当无法升级操作系统时 - **操作步骤**: - **Xcode项目**: 1. 打开`Project Settings > Build Settings` 2. 修改`MACOSX_DEPLOYMENT_TARGET`/`IPHONEOS_DEPLOYMENT_TARGET`为当前系统版本 3. 禁用新特性API:`ENABLE_HARDENED_RUNTIME = NO` - **CMake项目**: ```cmake set(CMAKE_OSX_DEPLOYMENT_TARGET "10.13") # 设置为当前系统版本 ``` #### 3. **工具链降级** - **适用场景**:当开发工具版本过高时(如引用[2]的GCC版本问题) - **操作步骤**: 1. 安装兼容旧系统的工具链: ```bash # macOS示例 xcode-select --install xcode-select -switch /Library/Developer/CommandLineTools ``` 2. 使用旧版SDK(需从开发者网站下载历史版本SDK) #### 4. **容器化解决方案** - **推荐方案**:使用Docker创建兼容环境 - **操作示例**: ```dockerfile FROM ubuntu:18.04 # 指定兼容的基础镜像 # 安装所需工具链 RUN apt-get update && apt-get install -y build-essential ``` 构建命令: ```bash docker build -t legacy-build-env . docker run -v $(pwd):/app legacy-build-env make ``` #### 5. **交叉编译** - **高级方案**:在新系统上为旧系统编译 - **关键参数**: ```bash # macOS示例 clang -target x86_64-apple-macos10.12 main.c # Linux示例 gcc -D__GLIBC_MINOR__=28 -static main.c ``` > **重要提示**:降低部署目标可能导致: > - 无法使用新版API特性 > - 安全漏洞风险增加 > - 应用商店审核被拒(移动端) > 建议优先升级操作系统[^1]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值