这2天升级到xcode6,用ios8 SDK编译老项目,各种Undefined symbols for architecture xxx,精神差点崩溃了。不过最后还是解决了,本文简单总结一下

简单来说,Undefined symbols基本上等于JAVA的ClassNotFoundException,最常见的原因有这几种:

build的时候没有加framework

比如说,有一段代码我用了OpenGL,引入了头文件

#import <OpenGLES/ES2/glext.h>

build的时候,compile阶段没有问题,但是link就报错Undefined symbols for architecture xxx(这里xxx可能是armv7s,armv7或者arm64,取决于配置,稍后会说)。解决方法是在Build Phases的Link Binary With Libraries里加入OpenGLES.framework,再编译就ok了

工程依赖的库,编译时Architectures不匹配

在Build Settings里,第一项Architectures,是配置项目的编译体系结构,主要有下面3个配置项:

Architectures:将要创建的Bundle支持的ARCH

Valid Architectures:有效的ARCH,这个配置项没什么用,一般配置成armv7,armv7s,arm64就行了

Build Active Architecture Only:是否只打当前连接设备对应的arch

在真机上,常见的ARCH有3个:armv7,armv7s,arm64

armv7:对应iPhone4和iPhone4S

armv7s:对应iPhone5和iPhone5C,还有早期的iPad

arm64/armv8:对应iPhone5S和iPhone6系列,以及比较新的iPad,如iPad mini2,iPad Air

而ARCH是向下兼容的,比如用armv7打出来的包,可以运行在arm64架构的设备上;反之不行。所以如果应用要支持iPhone4系列,Architectures就一定要包含armv7才行

而Build Active Architecture Only是指是否仅当前连接的设备的架构打包。比如Architectures配置了armv7和arm64,Build Active Architecture Only设置为YES,那么连接iPhone4的时候,就会以armv7打包;连接iPhone5S的时候,就会以arm64打包。如果Build Active Architecture Only设置为NO,那么就会2种架构都打,在运行期根据实际的设备架构来执行。所以最后打出来的Bundle体积会比较大

说了这么多,这个为什么造成Undefined symbols呢?因为还有另外一条规则,就是build link阶段,用arm64生成的.o文件,无法link用armv7s或者armv7生成的.o文件,所以就会link error

常见的情况是,项目引用了一个第三方库(比如从pod来的库),而这个第三方库打包的时候只支持armv7s和armv7,而项目有使用arm64打包,这个时候就会由于无法link,而报错Undefined symbols

解决的办法是,或者重新打包第三方库,加入arm64;或者自己的项目去掉arm64

有时候在模拟器上无法构建,在真机上可以

这种情况我只遇到过一次。我们的app可以连接一个外厂商的蓝牙打印机,对方提供了一个lib。当我们的项目引入了这个lib之后,就无法在模拟器上build通过了,但是在真机上是没问题的

iOS——armv7,armv7s,arm64详解相关推荐

  1. iOS armv7,armv7s, arm64

    目前ios的指令集有以下几种: armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch armv7 iPhone4 iPhone4S armv7s iPhone ...

  2. 第26月第22天 iOS瘦身之armv7 armv7s arm64选用 iOS crash

    1.iOS瘦身之armv7 armv7s arm64选用 机器对指令集的支持是向下兼容的,因此armv7的指令集是可以运行在iphone5S以上的,只是效率没那么高而已~ 但是由于苹果要求必须支持ar ...

  3. 关于iOS 编译器 armv7 armv7s arm64 i386 x86_64

    armv7 armv7s arm64 是ARM处理器的指令集 i386 x86_64 处理的指令集 对应的设备 arm64:iPhoneX | iphone8 plus|iPhone8| iPhone ...

  4. xcode armv6 armv7 armv7s arm64

    眼下ios的指令集有下面几种: armv6 iPhone iPhone2 iPhone3G 第一代和第二代iPod Touch armv7 iPhone4 iPhone4S armv7s iPhone ...

  5. xcode armv7 armv7s arm64

    armv6 armv7 armv7s arm64引起编译包翻倍增大的问题,下边来说一下关于ios这个指令集 目前ios的指令集有以下几种: armv6 iPhone iPhone2 iPhone3G ...

  6. Cisco ××× 完全配置指南-连载-IOS ×××阶段2连接详解

    Cisco ××× 完全配置指南-连载-IOS ×××阶段2连接详解 详细配置见附件 转载于:https://blog.51cto.com/xuanbo/151764

  7. IOS学习之UINavigationController详解与使用(一)添加UIBarButtonItem

    转:http://blog.csdn.net/totogo2010/article/details/7681879 1.UINavigationController导航控制器如何使用 UINaviga ...

  8. iOS里面MVC模式详解

    iOS里面MVC模式详解 MVC是IOS里面也是很多程序设计里面的一种设计模式,M是model,V是view,C是controller.MVC模式在ios开发里面可谓是用得淋漓尽致. 以下是对斯坦福大 ...

  9. iOS开发证件要点详解

    iOS开发证书要点详解 引言 关于开发证书配置(Certificates&Identifiers&Provisioning Profiles),相信做iOS开发的同学没少被折腾.对于一 ...

最新文章

  1. quake3使用指南(转载)
  2. Hadoop历代版本及其特点
  3. python matplotlib 饼图标签重叠_Python绘制饼图调节字体大小、防止标签重叠解决方法...
  4. CentOS配置网易163 yum源
  5. kafka生产者和消费者端的数据不一致
  6. 完成DI 依赖注入功能
  7. 统一社会信用代码 正则验证
  8. 依赖配置中心实现注有@ConfigurationProperties的bean相关属性刷新
  9. 怎样与用户有效地沟通以获取用户的真实需求?
  10. 平庸程序员的成长笔记
  11. 【深入浅出通信原理-学习笔记】天线技术
  12. keil4for51与keil4forARM的安装与兼容
  13. 天正电气lisp是什么文件_教大家如何使用天正电气软件绘制图纸
  14. wps居中对齐不在中间_wps有时候居中对齐不是在中间
  15. 记录一次大创项目配置服务器的心得
  16. 如何生成王者荣耀、QQ飞车等游戏“空白名”、“重复名”等特殊名
  17. 华为H3CNE认证题库、教材-热门下载帖汇总!
  18. 智能运营助你轻松玩转消息推送
  19. 将阿拉伯数字转换为中文大写数字 —— pyhton实现
  20. 【数学建模】常用微分方程模型 + 详细手写公式推导 + Matlab代码实现

热门文章

  1. 3t硬盘 xp_怎么让xp支持3T硬盘
  2. 快速排序(三种方法实现)
  3. 关于虚拟屏使用的权限问题
  4. 将PDF格式转换成其它文档
  5. html 表格中的链接,html – 如何在表格单元格中自动换行链接,以便它不会破坏表格的流程?...
  6. 数据结构之 栈和队列
  7. 数商云:建材业内忧外患的局面,如何利用互联网实现产业升级再造
  8. 计算机教师职称申报工作总结,教师职称专业技术工作总结
  9. 永磁同步电机高频方波电压注入法(V0)
  10. python3遍历字典