曾静的博客

但行好事,莫问前程.

嗨,我是曾静 (@devzeng),目前暂居深圳。


这是我用来记录平日学习笔记的地方,欢迎您的访问.

iOS开发之Architectures设置

在iOS开发中经常遇到的一个错误是Undefined symbols for architecture arm64,这个错误表示工程某些地方不支持arm64指令集。本文围绕在iOS开发中经常遇到的关于Architectures方面的设置介绍iOS的指令集方面的知识点。

对于iOS设备来说iOS的指令集有armv6、armv7、armv7s、arm64这样四种,不同型号的iOS设备使用不同的指令集,下面是各自的区别:

  • armv6
    • iPhone、iPhone 3G
    • iPod 1G、iPod 2G
  • armv7
    • iPhone 3GS、iPhone 4
    • iPod 3G、iPod 4G、iPod 5G
    • iPad、iPad 2、iPad 3、iPad Mini
  • armv7s
    • iPhone 5、iPhone 5C
    • iPad 4
  • arm64
    • iPhone 5S
    • iPad Air, Retina iPad Mini

在Xcode的target->Build Settings中有一个Architectures的分组主要是用来设置Architectures方面的内容,下面重点介绍下面几个设置项的内容。

ios-architectures-config.png

Architectures

该编译选项指定了工程将被编译成支持哪些指令集,支持指令集是通过编译生成对应的二进制数据包实现的,如果支持的指令集数目有多个,就会编译出包含多个指令集代码的数据包,造成最终编译的包很大。

官方文档说明:

Space-separated list of identifiers. Specifies the architectures (ABIs, processor models) to which the binary is targeted. When this build setting specifies more than one architecture, the generated binary may contain object code for each of the specified architectures.

Build Active Architectures Only

该编译项用于设置是否只编译当前使用的设备对应的arm指令集。

当该选项设置成YES时,你连上一个armv7指令集的设备,就算你的Valid Architectures和Architectures都设置成armv7/armv7s/arm64,还是依然只会生成一个armv7指令集的二进制包。

当然该选项起作用的前提是你的Xcode必须成功连接了调试设备。如果你没有任何活跃设备,即Xcode没有成功连接调试设备,就算该设置项设置成YES依然还会编译Valid Architectures和Architectures指定的二进制包。

通常情况下,该编译选项在Debug模式都设成YES,Release模式都设成NO。

官方文档说明:

Boolean value. Specifies whether the product includes only object code for the native architecture.

Valid Architectures

该编译项指定可能支持的指令集,该列表和Architectures列表的交集,将是Xcode最终生成二进制包所支持的指令集。

比如将Valid Architectures设置支持的arm指令集版本有:armv7、armv7s、arm64,对应的Architectures设置的支持arm指令集版本有:armv7s,这时Xcode只会生成一个armv7s指令集的二进制包。

官方文档说明:

Space-separated list of identifiers. Specifies the architectures for which the binary may be built. During the build, this list is intersected with the value of ARCHS build setting; the resulting list specifies the architectures the binary can run on. If the resulting architecture list is empty, the target generates no binary.

说明

1、指令集是向下兼容的。比如,armv7s指令集的设备,可以兼容运行使用armv7、armv6编译的程序。

2、不同的Xcode支持的指令集不同,比如Xcode5.1.1支持armv7、armv7s、arm64三个指令集。自Xcode4.5起不再支持armv6。

3、如果想自己的app在各个机器都能够最高效率的运行,则需要将Build Active Architecture Only设置为NOValid architectures选择对应的指令集armv7 armv7s arm64。这个会为各个指令集编译对应的代码,因此最后生成的ipa体积基本翻了3倍。

4、如果想让app体积保持最小,则现阶段应该选择Valid architecturesarmv7Build Active Architecture Only设置YES/NO都无关紧要。

5、如果遇到Undefined symbols for architecture arm64这样的错误,一般是表示引入的第三方库不支持arm64的指令集,解决这个问题就只需要删除Architectures中的arm64的选项。

参考资料

1、《Xcode设置项之Architectures和Valid Architectures》

2、《xcode5 arm64》

3、《64-Bit Transition Guide for Cocoa Touch》

最近的文章

iOS开发之多系统版本兼容

Apple自2007年发布第一版iOS操作系统以来,差不多以后的每年都会发布新版的操作系统,从最开始的iPhone OS到现在即将正式发布的iOS8。目前市面上能见到的iOS的版本主要是iOS4.3、iOS5、iOS6、iOS7,在实际的开发中遇到很多用户由于各种各样的原因没有升级到最新版,这就给我们开发者带了不少的麻烦。不过值得高兴的是截止到2014年8月24日,目前市面上大部分的iOS设备已经更新到iOS7了(91% of devices are using iOS 7),对于一些占小...…

iOS继续阅读
更早的文章

iOS开发中Xcode常见使用技巧

Xcode是苹果公司开发向开发人员提供的集成开发环境(IDE),主要用于开发Mac OS X和iOS的应用程序只能运行于Mac操作系统下。本文旨在记录一些在开发中常见的Xcode的配置和使用技巧,后续会持续更新。更新说明 2014-08-27 v1.0 初稿 2014-09-24 V1.1 增加Xcode断点不进调试的相关内容 2014-09-26 V1.2 增加Xcode6缺失新建Empty Application相关模板的问题旧版本Xcode支持高版本的设备问题描述:如何解决Xc...…

iOS继续阅读