dyld: Library not loaded解决方案

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dyld: Library not loaded解决方案相关的知识,希望对你有一定的参考价值。

参考技术A 此问题是由于动态库依赖路径导致,分为两种情况:

在项目启动后,由于路径问题App直接崩溃,Xcode打印出以下信息:

根据打印内容,我们可以得知是 /usr/local/lib/libimobiledevice-glue-1.0.0.dylib 无法正确找到,解决方法如下:

至此该问题已解决。

首先进行问题定位,可以使用 otool 命令查看问题:
在终端输入 otool -L 动态库全路径 ,就可显示其内部引用信息。

有的时候崩溃并不是动态库文件没找到,而是动态库内部依赖路径有问题,Xcode会打印出以下信息:

根据打印内容,我们得知是由于 aa.3.dylib 这个库内部的引用无法找到,比如我的 libcrypto.3.dylib 真实路径是 Build/Products/Debug/xxx.app/Contents/Frameworks/libcrypto.3.dylib ,而这个 aa.3.dylib 内部的引用路径是 /usr/lib/libcrypto.3.dylib 。因此我们需要讲其修改:
打开终端输入以下命令进行修改:
install_name_tool -change 动态库中错误的引用路径 正确的引用路径 有问题的动态库全路径
比如我的示例:
install_name_tool -change /usr/lib/libcrypto.3.dylib @executable_path/../Frameworks/libcrypto.3.dylib aa.3.dylib的全路径
至此问题已解决。

IOS运行报错 "dyld: Library not loaded" 原因分析

我们的游戏IOS版在接入易接SDK后,启动出现如下错误

dyld: Library not loaded: @rpath/OnlineAHelper.framework/OnlineAHelper
  Referenced from: /var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/yzg
  Reason: no suitable image found.  Did find:
    /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22 at address=0x0349E000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper
    /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper: mmap() error 22 at address=0x034C6000, size=0x00014E70 segment=__LINKEDIT in Segment::map() mapping /private/var/mobile/Containers/Bundle/Application/35ED2A71-7F60-4A16-BA4C-ECD6493A1EE1/yzg.app/Frameworks/OnlineAHelper.framework/OnlineAHelper
 
里面给出了一些解决方法,包括清理缓存数据、重新安装证书等等。一开始我把这些方法几乎都尝试了一遍,但还是没有解决问题。
 
重新分析问题时,怀疑会不会是编译目标的CPU架构问题。我的测试机子是iPhone5s + iOS 9.2,编译目标架构选择了armv7 
用file命令查看易接的库内容显示其包含了armv7和arm64两个版本。iPhone5s是arm64架构的CPU,于是重新编译选择了arm64,问题顺利解决。
 
错误原因:
32位的库在加载到64位的机子的iOS9系统后,32位的pagesize由之前的4096字节变成了16384字节,从而导致32位的APP加载的动态库不能在64位机子运行。
 
解决的方法有两种:
1.在动态库的工程中的other linker flags中加入
-Wl,-segalign,4000
2.将APP升级到支持arm64架构(这也是我们现在的做法)
 

 

 

以上是关于dyld: Library not loaded解决方案的主要内容,如果未能解决你的问题,请参考以下文章

iOS dyld: Library not loaded crash问题

dyld: Library not loaded解决方案

dyld: Library not loaded: @rpath/libswiftCore.dylib

iOS 报错信息: dyld: Library not loaded: @rpath/XCTest.framework/XCTest Referenced from:

iOS开发之运行报错 dyld: Library not loaded: *** Reason: image not found

dyld: Library not loaded: /usr/lib/libstdc++.6.dylib