iOS Undefined symbols for architecture xxx问题的总结

今天项目刚更换了最新的播放器,结果在touch上build时遇到了Undefined symbols for architecture armv7的问题,在5s跟6上没有问题。之前就不少次遇到过这样的问题,都是匆匆解决了然后继续修复别的bug,今天看到了一篇讲的还算比较细的博客,就顺手拿了过来,之后在补充结合自己项目的理解吧。

以下为引用内容:原文链接http://www.th7.cn/Program/IOS/201410/296636.shtml

简单来说,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通过了,但是在真机上是没问题的

时间: 2024-08-28 22:30:26

iOS Undefined symbols for architecture xxx问题的总结的相关文章

ios build时,Undefined symbols for architecture xxx问题的总结

这2天升级到xcode6,用ios8 SDK编译老项目,各种Undefined symbols for architecture xxx,精神差点崩溃了.不过最后还是解决了,本文简单总结一下 简单来说,Undefined symbols基本上等于JAVA的ClassNotFoundException,最常见的原因有这几种: build的时候没有加framework 比如说,有一段代码我用了OpenGL,引入了头文件 #import <OpenGLES/ES2/glext.h> build的时候

Xcode编译Undefined symbols for architecture XXX报错

Undefined symbols for architecture armv7Undefined symbols for architecture armv7sUndefined symbols for architecture arm64Undefined symbols for architecture i386Undefined symbols for architecture x86_64 多个人共同操作同一个项目或拷贝项目时,经常会出现类似这样的问题: Undefined symbo

Undefined symbols for architecture xxx,出错总结

简单来说,Undefined symbols基本上等于JAVA的ClassNotFoundException,最常见的原因有这几种: 1.build的时候没有加framework build的时候,compile阶段没有问题,但是link就报错Undefined symbols for architecture xxx(这里xxx可能是armv7s,armv7或者arm64,取决于配置,稍后会说).解决方法是在Build Phases的Link Binary With Libraries里加入x

Xcode编译Undefined symbols for architecture xxx 错误总结

每次遇到这种错误就头痛,不知道要害死多少脑细胞了,就在这里做个总结吧 可能会遇到这几种错误:Undefined symbols for architecture armv7Undefined symbols for architecture armv7sUndefined symbols for architecture arm64Undefined symbols for architecture i386Undefined symbols for architecture x86_64 错误

iOS Undefined symbols for architecture arm64解决办法

Undefined symbols for architecture arm64:  "_OBJC_CLASS_$_YYCache", referenced from:      objc-class-ref in LFNetworking.o  "_OBJC_CLASS_$_AFHTTPRequestSerializer", referenced from:      objc-class-ref in LFNetworking.o  "_OBJC_CL

ios Undefined symbols for architecture arm64

我追加了 一个之前写的 关于加载的 .h.m文件 但是在我新追加其他工程里面 突然报错: Undefined symbols for architecture arm64: "_OBJC_CLASS_$_MBProgressHUD", referenced from: objc-class-ref in loginController.old: symbol(s) not found for architecture arm64clang: error: linker command

iOS出现 Undefined symbols for architecture armv7 std::basic_string&lt;char, std::char_traits&lt;char&gt;

Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ld: symbol(s) not found for architecture i386 clang: error: linker command failed with exit code 1 (use -v to see invocation) 如果真机调试就是 undefined symb

【IOS】Undefined symbols for architecture x86_64

[IOS]Undefined symbols for architecture x86_64 先说一下这个问题的出现原因,字面意思就是某个符号不识别.一般问题都是由于引入了手动引入了某个lib,但是没有设置相应的编译选项或者没有引入其依赖的lib. 解决方法: 通过cocoapods引入lib,这样一般没有什么问题. 仔细查看文档,看看有什么依赖的lib没有引入,引入即可,或者加入相应的编译选项. 大体上就是上面两种,而且都很泛泛,下面说一下我遇到的具体问题. 开发环境:xcode 6.3.1

iOS:编译错误Undefined symbols for architecture i386: _OBJC_CLASS_$_XXX&quot;, referenced from: error

Undefined symbols for architecture i386: _OBJC_CLASS_$_XXX", referenced from: error 这个意思为无法找到名为XXX的类,进而还会导致一个无法连接的一个报错,只要把这个解决了就好了 既然没有这个类,我们就需要添加这个类 第一步: 选择项目文件,找到TARGETS 第二步: 选择 Build Phases 第三步: 选择 Compile Sources 第四步: 添加 XXX.m 类(切记,添加的是.m文件) 然后可能