XCode中Architecturs配置及常见问题

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配置及常见问题,布布扣,bubuko.com

时间: 2024-10-12 20:38:11

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

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

书接上回提出的Git在Xcode中的配置与使用常见问题4个问题 问题1,如何在Xcode中创建代码库,并添加和提交代码到代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问题3,如何在Xcode中克隆远程服务器代码库到本地? 问题4,如何使用Xcode获取远程代码库数据,并解决冲突问题? 1.问题1 创建代码库有两种方式,一种是新建工程时候创建,另一种是把现有的工程拷贝到代码库下,再初始化代码库. 如果是新建工程时候创建,在保存文件时候可以选择是否创建,如果勾选“Create l

OpenCV 在mac下的安装以及在Xcode中的配置

1. app store下载xcode 2. OpenCV 官网下载OpenCV for linux/mac 3.安装homebrew 4.命令行使用brew install cmake 安装cmake 5.cd 到opencv解压后的文件夹,在命令行依次执行以下命令: mkdir build cd build cmake -G "Unix Makefiles" .. make sudo make install 至此opencv安装完毕 进入xcode新建命令行mac ox程序,使用

Xcode 中 Git 的配置与使用

Xcode 中 Git 的配置与使用主要围绕下面几个问题展开阐述: 问题1,如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 问题2,如何在Xcode中提交推送给远程服务器代码库? 问题3,如何在Xcode中克隆远程服务器代码库到本地? 问题4,如何使用Xcode获取远程代码库数据,并解决冲突问题? 一.如何在Xcode中创建本地代码库,并添加和提交代码到本地代码库? 创建代码库有两种方式: 方式1:新建工程的时候创建 1. 勾选Create Git repository on

Xcode中 Object-C中编译ARC配置

Xcode4.2(iOS 5)以后启用了ARC(Automatic Reference Countion)技术(即内存自动管理机制) 1.需要iOS5才支持: 2.很多引用的类库暂时还不支持. 麻烦的是对大多数第三方库需要加禁用arc的编译flag,因为大多都因为兼容性还在使用手动内存管理. 虽然4.2以后版本仍然可以不开启ARC,  但是我们在建工程的时候有时为了不想管理内存然后就启用了ARC, 但是再开发过程中需要用到第三开发类库, 而这些第三方类库或是没做更新而不支持ARC,然后编译时就出

计算机图形学-mac系统下Xcode中OpenGL开发环境配置。

mac系统下Xcode中OpenGL开发环境配置. 这学期有计算机图形学的课程,需要用到OpenGL,最近着手开始配置开发环境了,老师上课给的安装包都是基于windows系统的.网上也是windows上配置的教程比较多,Mac版的比较少.我综合了几个教程并自己总结,实践成功.特来分享配置过程.希望能帮到大家! 介绍 OpenGL(Open Graphics Library)是定义了一个跨编程语言,跨平台的编程接口规格的专业的图形程序接口.它用于三维图像(二维亦可),是一个功能强大,与硬件无关,调

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

Xcode 自带的代码格式化功能(control + I)很有限,其 "格式化" 仅限于设置缩进,代码里面的格式是不会处理的.所以需要借助额外的工具来完成代码的美化. clang-format 便是可选的工具之一,它可用来格式化 C/C++/Java/JavaScript/Objective-C/Protobuf/C# 等代码. 其内置了多种预设的代码风格,分别有 LLVM, Google, Chromium, Mozilla, WebKit. 可通过添加 .clang-format

[WAMP]Wamp配置及常见问题

知识点: 1.WampSever 指的是apache + mySQL + PHP 三合一套装,第一字母W,是指用于windows系统,我用的是2.0f版.用于Linux系统的,是LampSever,第一字母是L. 下载地址:http://jaist.dl.sourceforge.net/sourceforge/wampserver/WampServer2.0f.exe 如果上述链接失效,请到官方网站:http://www.wampserver.com/ 下载最新版. 2.localhost和12

Xcode中如何在即将启动的APP中设置断点调试

在实际的App应用中,我们可能会碰到这么一种情况:我们设计一个APP,它可能会在外界发送某种消息或满足某种条件时,被动的启动加载,并根据外界传入的一些参数进行初始化工作. 这里由于程序是由其他程序启动的,所以我们不能够直接在XCode中编译运行程序并设置断点调试.但幸运的是,XCode提供了附加在进程上的调试功能,并且可以在进程启动前,通过进程名称等待进程运行,并在进程真正加载起来时,进入断点调试.具体方法如下: 1.在待调试的XCode中选择Debug->Attach to Process->

工欲善其事,必先利其器:Xcode中的各种概念

概念:project 指一个项目,该项目会负责管理软件产品的全部源代码文件.全部资源文件.相关配置,一个Project可以包含多个Target. 概念:target 一个target指的是根据project中的其它内容生成的最终产品,它是线程可以直接读懂的代码. 概念:scheme scheme是一个过程,它定义了一个target被生成的一系列过程.可在Scheme中定义的Target的构建过程有:Build/Run/Test/Profile/Analyze/Archive 概念:workspa