持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第5天,点击查看活动详情
起因
在接入一些三方的时候,会遇到 dyld: Library not loaded: @rpath/XXXX Reason: image not found
的问题,导致闪退
原因探究
根据提示,可以得知两个情报:一个是库没加载到,二是没有找到对应镜像。那么就可以推出一个结论,就是设备中找不到对应的库。
这是在有用到动态库的时候才会出现的问题。静态库跟动态库的区别就在于编译之后,静态库会将自身复制到程序中,会增加程序的大小;而动态库只相当于一个引用指向的作用,不影响程序体积,并可以让许多程序共用一个库。
而出现的原因有两种:
1.调用的是系统库:设备版本太低,而编译的时候所用的版本又太高,设备中不存在这么高版本的库。例如:Photos.framework 库是 iOS 8 之后才支持的,那么如果是 iOS 8 之前的版本,在调用的时候,就会发现设备上找不到对应库,导致报错。
2.调用的是三方库:在Xcode 6之后,iOS 平台就已经添加了对于动态库的支持,那么就有可能会接入一些三方的动态库。那么理所当然的,如果没做相关的处理,肯定会找不到对应的库。
问题处理
既然找到了原因,那么对症下药即可,两种症状两贴药方
- 系统库出现问题:例如 Photos.framework 找不到,那么可以将 Photos.framework 先加入到 Link Binary With Libraries ,并将 status 改为 Optional。如果有可替代的库,则加入对应的库。如加入 AssetstLibrary.framework 库做替代。
- 三方库出现问题:三方库找不到,那么就只能把库加入到工程中,如果有Embed Frameworks,那么就直接加入即可
如果没有的话,那么需要
1、选择新增 New Copy Files Phase
2、将 Destination 设置为 Frameworks
3、加入对应的动态库,齐活
题外
可以用 file 命令查看三方库是动态的还是静态的