http://lanvige.github.io/2014/03/19/architecturs-in-xcode/

XCode 5.1升级后因arm64和CocoaPods的原因,痛了一天,终于解决了问题,同时也记录下这次的学习成果。

ARMv6/7/7s & ARM64

在了解Architecture之前,先来认识这几个名字。armv6, armv7, armv7s, arm64是ARM CPU的不同指令集,就像CPU内潜入的软件版本。其在iPhone处理器型号为A4, A8…

arm 芯片 iPhone 机型
armv6 iPhone, iPhone2, iPhone 3G
armv7 iPhone 3GS, iPhone 4, iPhone 4S
armv7s iPhone 5
arm64 iPhone 5s

指令是向下兼容的,如iPhone5s CPU支持arm64, 但它同时兼容armv7s,只是如果程序使用armv7s指令进行编译,可能无法充分发挥它的64位特性。

Architecture是指该程序编译时的目标设备(就是ARM指令集,如armv7,armv7s…),编译期会为不同的指令集(设备)生成专有的安装包。不同设备上会执行该设备对应的指令集,如iPhone5s会优执行arm64(如果有)

XCode配置

在Target的Architectures设置项内,可以手工分别添加以上的这几个值,从而新增或删除特性指令集。为了更方便的使用指令组合,XCode中定义了一些变量,然而这些变量在不同的XCode版本下又有着不同的值。

  • $(ARCHS_STANDARD) 
    这个为XCode中Architecture的默认值,XCode5中,该值为armv7, armv7s,在XCode 5.1时,强制加入了对arm64的编译,于是该值为armv7, armv7s, arm64。
  • $(ARCHS_STANDARD_32_BIT) 
    XCode 5和5.1中都为armv7, armv7s,旧一点的版本中应该对应的就只有armv7
  • $(ARCHS_STANDARD_INCLUDING_64_BIT) 
    XCode 5和5.1中都为armv7, armv7s, arm64

如果程序中设置的Architecture为armv7,当使用iPhone 5真机debug时,就会出现“xxxx does not contain a(n) armv7s slice:xxxxx for architecture armv7s”的编译错误,想要解决这个问题,在Architecture中加上armv7s即可。这种情况更常见于第三方开源库上。

XCode 5.1后强制加上了对arm64的支持,但很多很三方库没有进行更新,就导致会产生编译错误。这个解决办法就是删掉XCode 5.1中的默认Architecture,然后分别加上armv7armv7s,clean后重新build就可以了。等第三方库都支持arm64后,再把该值改回来即可。

同时开启arm64支持后,就不能对iOS 5.1.1之前版本进行开发,要强制将deployment target 设置为5.1.1或之后。

XCode 4.5中移除了对arm6的支持,如果想开发对arm6支持的应用,就要保持用老的XCode了。

查看.a库支持的指令集

可以通过该lipo命令查看.a库所支持的指令集。

1
2
3
4
5
6
~/Library/Developer/Xcode/DerivedData/xxxx/Build/Products/Debug-iphoneos

$ lipo -info *.a

Architectures in the fat file: libPods-AFNetworking.a are: armv7 armv7s
Architectures in the fat file: libPods.a are: armv7 armv7s

Active Architecture

Architectures下有一个Bool型的配置项,叫作Build Active Architecture Only

  • YES,表示会针对目标设备进行编译,只会编译对应指令集的包,此时的安装包比较小,但只针对于该指令集设备;
  • NO,编译器会整合两个指令集到一起,生成的安装包比较大,但是能在不同的设备上安装运行。

一般都是Debug时“Build Active Architecture Only”选择YES,用当前的架构看代码逻辑是否有问题;而在Release时选择NO,来适配不同的设备。

此外,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。所以生成静态库时都是会先生成两个.a,一个是i386的用于在模拟器运行,另一个是在真实设备上运行的,然后再用命令将两个.a进行合并成。

CocoaPods与Architecture

CocoaPods中所生成Pod项目时,会根据当前Project中的配置来为Pod包的Target Architecture配置。结束后,会有下面的文字提示。

[!] Found multiple values (‘armv7’, ‘armv7s’) for the architectures (‘ARCHS’) build setting for the ‘Pods’ target definition. Using the first.

也就是所如果有多个配置的话,它只会统一的给所有的包target设置为第一个(举例,在Origin Projectg下配置的Architecture为armv7 & armv7s 两个项时,pod生成的项目的所有target中都只默认添加armv7一个项)。

对于XCode 5.1中64位的Error,用$(ARCHS_STANDARD_32_BIT)代替系统默认的$(ARCHS_STANDARD)可以避免这样的问题。

Automatically Select Architecture

REF::

Posted by Lanvige Jiang Mar 19th, 2014  ios

XCode中Architecturs配置及常见问题的更多相关文章

  1. Git在Xcode中的配置与使用常见问题总结

    书接上回提出的Git在Xcode中的配置与使用常见问题4个问题 问题1,如何在Xcode中创建代码库,并添加和提交代码到代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问题3,如何在 ...

  2. Xcode 中 Git 的配置与使用

    Xcode 中 Git 的配置与使用主要围绕下面几个问题展开阐述: 问题1,如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问 ...

  3. XCODE中配置使用boost

    1.  开发平台:os x 2.  boost安装目录: 3.  xcode中配置:    4. 测试  

  4. Xcode 中配置 clang-format 格式化 C++ 代码

    Xcode 自带的代码格式化功能(control + I)很有限,其 "格式化" 仅限于设置缩进,代码里面的格式是不会处理的.所以需要借助额外的工具来完成代码的美化. clang- ...

  5. iOS开发时,在Xcode中添加多个Targets进行版本控制

    在iOS开发中,很可能有以下场景:需要开发多个版本,或因需区分收费版,免费版,或因为网络环境需要区分测试版,发布版,或因渠道不同需要区分企业版,AppStore版等等.解决办法无非就是CheckOut ...

  6. [翻译]使用Swift在Xcode中创建自定义控件

    使用Swift在Xcode中创建自定义控件 原文 IBDesignable and IBInspectable With IBDesignable and IBInspectable, develop ...

  7. 【转】jsoncpp在xcode中的使用

    http://blog.csdn.net/ashqal/article/details/8573392 考虑到cocos2dx需要使用jsoncpp做关卡的设置, 尝试用源代码直接放到项目以方便后期生 ...

  8. xcode中的第三方库配置问题总结

    xcode中的第三方库配置总结 在导入第三方库的时候,总是会遇到许多的问题.在这里,我记录一下学到的一些知识点.写得比较乱.只要是想要记录下来,在第三方库导入的时候,遇到的一些问题. 参考网址: ht ...

  9. iOS 在 Xcode 中重命名项目名称

    本教程使用的 Xcode 版本是Xcode 6.3.1,网上有好多的教程,都是在 Xcode 4 上做的讲解,现以本文章讲解一下如何在 Xcode 6.3.1 中重命名你的项目名称,包括你的应用名称. ...

随机推荐

  1. 学习C++ Primer 的个人理解(七)

    类,后面还有两章是介绍有关于类的内容的.这一张依然只是个概括.但也已经将大致用法介绍完了. 重点如下: 1.成员函数的声明,必须在类的内部. 2.引用const成员函数 我们知道成员函数中有一个名为t ...

  2. POJ 1050 To the Max -- 动态规划

    题目地址:http://poj.org/problem?id=1050 Description Given a two-dimensional array of positive and negati ...

  3. VPN client on linux debian

    Install the pptp-linux and pptp-linux-client: sudo apt-get install pptp-linux pptp-linux-client Crea ...

  4. Linux CPU亲缘性详解

    前言 在淘宝开源自己基于nginx打造的tegine服务器的时候,有这么一项特性引起了笔者的兴趣.“自动根据CPU数目设置进程个数和绑定CPU亲缘性”.当时笔者对CPU亲缘性没有任何概念,当时作者只是 ...

  5. 初涉GitHub

    安装 访问https://help.github.com/articles/set-up-git/,选择对应OS平台.有文档参考,我的是OpenSuse. 在console中下载安装http://ww ...

  6. ACE 6.2.0 AIX 编译

    注:ace只能使用gnu的make 一.IBM  AIX版本 $unameAIX$oslevel6.1.0.0$ ACE+TAO+CIAO-6.2.0.tar 二.GNU make版本:make-3. ...

  7. Python设计模式——建造者模式

    需求,画人物,要求画一个人的头,左手,右手,左脚,右脚和身体,画一个瘦子,一个胖子 不使用设计模式 #encoding=utf-8 __author__ = 'kevinlu1010@qq.com' ...

  8. 【BZOJ】1046 : [HAOI2007]上升序列

    1046: [HAOI2007]上升序列 题意:给定S={a1,a2,a3,…,an}问是否存在P={ax1,ax2,ax3,…,axm},满足(x1 < x2 < … < xm)且 ...

  9. c语言贪吃蛇

    思路:函数gotoxy(x,y)使光标移植屏幕的x,y坐标(屏幕左上角为0,0),用来绘制蛇和界面,color()函数用来设置绘制的颜色.设有snakelong节,第i节蛇的x坐标为x[i],y坐标为 ...

  10. cocos2dx Tab选项卡控件的实现

    选项卡控件在游戏和应用中很是常见,但是cocostudio里并没有实现好的选项卡控件,于是自己封装了 一个,效果如下: 代码: TabUiControl.h #pragma once //std #i ...