iOS 异常处理 - Undefined symbols

最近做unity项目在ios端的出包,遇到了一些unity项目中的sdk在实际ios工程中的build的时候的API库没链接好的问题。记录一下过程。

前言

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

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

常见错误

在这里插入图片描述

我们来理解一下报错的含义:

未能在 x86_64 架构下发现定义的标识符OC 类 ZMBLEManager,

这个标识符 ZMBLEManager 在ViewController文件中被引用:

分析下:

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

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

解决思路

  1. 去查看对应的.m文件,类的实现是否存在(刚开始做Unity在ios平台的出包, Unity项目内部有SDK,打包出来之后,需要在Ios工程中配好工程出apk的,可能会遇到这种情况)

  2. 从外部导入的文件没有加入到特定的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文件中包含了对应真机的架构,但没有包含对应的模拟器架构!


这是另一篇文章关于这个问题的描述。和前面的有些类似,但是说法更加清晰小白,所以也转一下

最常见的原因有这几种:

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体积会比较大

参考链接

iOS 异常处理 - Undefined symbols

iOS 编译Undefined symbols报错问题

ios的Build Phases

Unity导出IOS报错,Undefined symbols for architecture arm64

Unity XCode打包报错 Undefined symbols for architecture arm64

Unity在Android和iOS中如何调用Native API

Unity iOS工程报错解决:Undefined symbols for architecture arm64:

ijkPlayer使用遇到的问题

猜你喜欢

转载自blog.csdn.net/weixin_43149049/article/details/127304636
今日推荐