简单来说,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 build时,Undefined symbols for architecture xxx问题的总结的更多相关文章

  1. Undefined symbols for architecture xxx

    解决方法: "Build Settings"->"Linking"->"Other Linker Flags" add the ...

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

    可能会遇到这几种错误:Undefined symbols for architecture armv7Undefined symbols for architecture armv7sUndefine ...

  3. iOS出现 Undefined symbols for architecture armv7 std::basic_string<char, std::char_traits<char>

    Undefined symbols for architecture i386: “_OBJC_CLASS_$_XXX”, referenced from: objc-class-ref in XXX ...

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

    Undefined symbols for architecture i386: _OBJC_CLASS_$_XXX", referenced from: error 这个意思为无法找到名为 ...

  5. Undefined symbols for architecture arm64: "_OBJC_CLASS_$XXX", referenced from: objc-class-ref in XXX

    ld: symbol(s) not found for architecture arm64 clang: error: linker command failed with exit code 1 ...

  6. 静态库引入引起的错误解决方案,ld: warning: ignoring file ”…/XXX.a”, file was built for archive which is not the architecture being linked (armv7): “…/XXX.a” Undefined symbols for architecture armv7: "_OBJC_CLASS_$

    想目中不免会引入一些静态库,可是有时加入'.a'文件后编译便会报以下错误 ld: warning: ignoring file ”…/XXX.a”, file was built for archiv ...

  7. ios开发错误之: Undefined symbols for architecture x86_64

    错误如下: Undefined symbols for architecture x86_64: "_OBJC_CLASS_$_RoutingHTTPServer", refere ...

  8. 当编译AFNetworking 2.0时出现了Undefined symbols for architecture i386

    当将AFNetworking添加到工程后编译时出现 Undefined symbols for architecture i386: "_SecCertificateCopyData&quo ...

  9. oc调用c++接口时 报错 Undefined symbols for architecture i386:

    当在oc中调用c++中的方法时,发现说c++中的方法没定义或是找不到 Undefined symbols for architecture i386: "_desTYData", ...

随机推荐

  1. phpstorm 激活服务器

    phpstorm 激活服务器 http://jetbrains.tencent.click/ (2016-09-19 可用) webstorm 激活服务器 http://owo.help(2016-0 ...

  2. 浅谈js命名空间管理

    在C# 和 Java里面我们如果想使用哪一个功能类就要引用相应的命名空间. 如C#里面有个System.Web.UI库,我们就要用using   System.Web.UI;,之后我们就可以用到Scr ...

  3. Python-urlparse

    如何把get请求的参数转成字典 (Map) urlparse.parse_qs(params) //str 需要转成字典的 请求参数 //{'phone': ['075988888888'], 'id ...

  4. iOS 如何打开后灯(闪光灯)

    - (void)torchOnOrOff { AVCaptureDevice *device = [AVCaptureDevice defaultDeviceWithMediaType:AVMedia ...

  5. 【BZOJ 3642】Phi的反函数

    http://www.lydsy.com/JudgeOnline/problem.php?id=3643 因为\[\varphi(n)=\prod_i p_i^{k_i-1}(p_i-1),n=\pr ...

  6. 【原创】cs+html+js+css模式(七): 顺序执行与并发执行问题,IIS7及其以上版本的抛错问题解决

          在进行开发的过程中,针对于这种模式,我们继承的IRequiresSessionState,这种对于我们的同一个IIS的执行中是顺序执行即一个ajax请求处理完成后,才能执行下一个ajax, ...

  7. 上传AppStore出现:Unexpected CFBundleExecutable Key 错误

    解决办法:就是把无用的CFBundle删除掉. 根据提示,找到对应第三方的SDK, 找到第三方的info.plist文件,删除里面的Executable file对应的一整行,包括值.

  8. '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error

    '0000-00-00 00:00:00' can not be represented as java.sql.Timestamp error 异常现象 ### Cause: java.sql.SQ ...

  9. Java实现的二分查找算法

    二分查找又称折半查找,它是一种效率较高的查找方法. 折半查找的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小 于该中点 ...

  10. 常用的网络命令--之...... Ipconfig详解

    ipconfig是运行微软的Windows9x/NT/2000/XP/Vista操作系统的电脑上用来控制网络连接的一个命令行工具.它的主要功用,包括用来显示现时网络连接的设置(/all参数),或通过/ ...