此问题是由于动态库依赖路径导致,分为两种情况:
- 动态库文件本身路径问题。
- 动态库文件内部依赖路径问题。
1. 动态库文件本身路径问题
在项目启动后,由于路径问题App直接崩溃,Xcode打印出以下信息:
dyld[2749]: Library not loaded: /usr/local/lib/libimobiledevice-glue-1.0.0.dylib
Referenced from: /Users/mac/Library/Developer/Xcode/DerivedData/xxx-bmqqjnrjuqneetcoyaukbolzzjwn/Build/Products/Debug/xxx.app/Contents/MacOS/xxx
Reason: tried: '/Users/mac/Library/Developer/Xcode/DerivedData/xxx-bmqqjnrjuqneetcoyaukbolzzjwn/Build/Products/Debug/libimobiledevice-glue-1.0.0.dylib' (no such file), '/usr/lib/system/introspection/libimobiledevice-glue-1.0.0.dylib' (no such file), '/usr/local/lib/libimobiledevice-glue-1.0.0.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')), '/usr/lib/libimobiledevice-glue-1.0.0.dylib' (no such file)
根据打印内容,我们可以得知是/usr/local/lib/libimobiledevice-glue-1.0.0.dylib
无法正确找到,解决方法如下:
- 先将该文件添加到项目工程中(已添加则跳过)
- 到
Targets->BuildPhases->Embed Libraies
下如图添加内容:
- 打开终端输入以下命令进行修改:
install_name_tool -id @executable_path/../Frameworks/你的动态库名字 你到动态库的全路径
说明:@executable_path/../Frameworks/
指的是最终App包内容的Frameworks
文件夹,iOS/macOS应用显示包内容即可看到。
至此该问题已解决。
2. 动态库文件内部依赖路径问题
首先进行问题定位,可以使用otool
命令查看问题:
在终端输入otool -L 动态库全路径
,就可显示其内部引用信息。
有的时候崩溃并不是动态库文件没找到,而是动态库内部依赖路径有问题,Xcode会打印出以下信息:
Referenced from: /Users/mac/Library/Developer/Xcode/DerivedData/xxx-bmqqjnrjuqneetcoyaukbolzzjwn/Build/Products/Debug/xxx.app/Contents/Frameworks/aa.3.dylib
Reason: tried:
'/Users/mac/Library/Developer/Xcode/DerivedData/xxx-bmqqjnrjuqneetcoyaukbolzzjwn/Build/Products/Debug/libcrypto.3.dylib' (no such file),
'/usr/lib/system/introspection/libcrypto.3.dylib' (no such file),
'/usr/local/lib/libcrypto.3.dylib' (mach-o file, but is an incompatible architecture (have 'arm64', need 'x86_64')),
'/usr/lib/libcrypto.3.dylib' (no such file)Library not loaded: /usr/local/lib/libimobiledevice-glue-1.0.0.dylib
根据打印内容,我们得知是由于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的全路径
至此问题已解决。