Undefined symbols for architecture XXXX

是时候总结一下类似问题了.....

情形一

error.png

这种问题缺少依赖库,解决方案:

  • 首先更新一下工程,更新结束以后,发现还不行,接着往下看
  • 找到工程的podfile.lock文件,删除该文件,重新 执行 pod install ,针对podfile.lock问题,可以查看这里,更新的过程总发现问题如下图,友盟竟然更新了一个新版本。。说明原因就这这里了。
fix1.png

如果上述方案不行,还可以试试下面的方案:
build phases -> link binary with libraries , add 进去缺少的 framework 即可,如下图:


fix2.png

情形二

fix3.png

在网上搜了好久,各种解决方法出现这个问题的原因可能不是唯一的,大致分为两种都是以下原因:

  • 在使用第三方包的时候,没有导入相应的框架
  • 还有就是导入第三方的静态库只支持armv7 armv7s i386 ,并不支持 XXXX
  • 而在你的工程中Valid Architectures和Architectures中均包含了arm64的指令集,需要你下载一个支持arm64的静态库文件

查看了静态库所支持的架构,打开终端输入查看命令lipo - info xxx.a ,结果如下:


fix4.png

还有一些说的target->Build Settings-->Architectures的arm64删掉,不知道会不会有影响,可以尝试一下

另外补充一下: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 iPhone 6 iPhone 6Plus iPad Air, Retina iPad Mini

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。

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

你可能感兴趣的:(Undefined symbols for architecture XXXX)