iOS 异常处理 - Undefined symbols

前言


作为iOS开发中最常见的问题之一,今天好好来把它拎清一下!

OC基于C语言,是扩充C的面向对象编程语言。有.h和.m文件,.h头文件中是对定义的声明,而.m中则是具体的实现逻辑代码。


常见错误


错误提示

我们来理解一下:

未能在 x86_64   架构下发现定义的标识符:

OC 类 ZMBLEManager, 在以下文件中被引用:

在ViewController中引用了OC类。

分析下:

1)在ViewController中使用了“ZMBLEManager”,在编译时未报错,说明在.h文件中有“ZMBLEManager”的声明。

2)链接时报错“Undefined symbols”,说明在.M文件中并没有ZMBLEManager的实现。


解决思路


1)去查看对应的.m文件,类的实现是否存在!(一般没人会犯这种错误吧~~~)

2)从外部导入的文件没有加入到特定的target中。


未勾选target

通常此类问题都是导入静态库之后会产生的,那我们就要检查一下导入静态库的姿势是否正确!

1)必须引入头文件对应的.a文件,一定要勾选target。

2)检查Build Phases里的Link Binary With Libraries(如果未勾选target会造成Link Binary With Libraries不包含对应的.a)和Build Settings里的几项Search Path(查看路径是否设置正确)。

3)未包含处理器架构指令集的问题。报错时的提示一般都是“Undefined symbols for architecture x86_64”之类的,而“for architecture x86_64”就是说没有支持x86_64,在Build settings里architecture相关的几项需要配置正确。

相信很多朋友都碰到过这样的情况,使用第三方提供的SDK,在模拟器上无法运行,但是切换到真机就能跑的飞起!!!

这是因为引入的.a文件中包含了对应真机的架构,但没有包含对应的模拟器架构!

如果你想深入了解可以查看iOS 静态库 - 常用操作指令 ,尝试去分解你的静态库,了解内部构造。

如果以上方案都没能解决你的问题,欢迎私信!当然还有可能你的静态库跟.h本来就是不对称的~~~~~


下期预告


iOS 异常处理 - Duplicate Symbols






推荐阅读更多精彩内容