首先目前iOS设备从iPhone4s到如今的iPhone7,已经是跨过了很大的设备版本号了,CPU也是一步一步的升级,于是到开发者这边的时候我们不仅仅是对iOS版本的兼容,同时也要在开发中对CPU的兼容。
目前在iOS设备上的CPU指令为一下几种:
- armv6:iPhone,iPhone2,iPhone3G
- armv7:iPhone3GS,iPhone4,iPhone4S
- armv7s:iPhone5,iPhone5C
- arm64:iPhone5S及以上设备
arm的意思其实是指处理器的品牌,ARM是英国Acorn有限公司设计的低功耗成本的RISC微处理器。
但是我们在编译的时候偶尔会报出i386,x86_64的错误,iOS设备都不是这两个的架构,那为什么还会报错呢?
其实是因为:
i386是针对Intel的32为处理器,x86_64是针对x86架构的处理器
模拟器32位的处理器需要i386的架构,64位的处理器需要x86_64的架构。
真机32位需要arm7,或者arm7s架构,64位需要arm64架构。
所以就可以解释为什么有时候人会问在真机上没问题模拟器上会报错了。
分割线
undefined symbols for architecture i386
这个是错误信息
_OBJC_CLASS_$_TencentOAuth
这个是错误的包
objc-class-ref in DFAppDelegateInitHelper.o
这个是具体文件调用的位置
首先遇到这种错误的解决方法:
- 查看静态包是否支持i386,具体查看方法
打开终端,使用
lipo -info 静态包地址.a
查看
- 注意: 如果是framework的话直接使用以上命令是会报错的,framework的查看方法是:
cd 到framework内部,之后在使用 lipo -info xxxFramework
或者 lipo -info xxxFramework/xxFramework
然后可以发现这里使用的framework并不支持i386
所以这里的问题就可以说明了。