Mac动态库加载找不到image not found的问题
【问题】:
使用dlopen加载动态库的时候,报这样的错误
OpeningLibraryError(Custom { kind: Other, error: "dlopen(/xxxxxxx/libaaa.dylib, 5): Library not loaded: libbbb.dylib\n Referenced from: /xxxxxxxlibaaa.dylib\n Reason: image not found"
【原因】:
原因是libaaa.dylib里要加载libbbb.dylib,但是找不到libbbb.dylib这个image。我把libbbb.dylib和libaaa.dylib放在同一个/xxxxxxx/下面,这个路径下面还有一个libccc.dylib是加载成功了的。于是使用otool查看动态库的加载路径
otool -L libaaa.dylib
libaaa.dylib:
libaaa.dylib (compatibility version 0.0.0, current version 5.10.31)
libccc.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libbbb.dylib (compatibility version 0.0.0, current version 0.0.0)
可以看到libbbb.dylib是从@rpath下面去查找的,所以找不到。而libccc.dylib直接从当前路径加载,所以能成功。使用otool查看rpath
otool -l libaaa.dylib
...
Load command 17
cmd LC_RPATH
cmdsize 144
path @loader_path/../../../../../../../.rustup/toolchains/nightly-2022-01-30-x86_64-apple-darwin/lib/rustlib/x86_64-apple-darwin/lib (offset 12)
...
是rustup是一个安装路径,所以找不到libbbb.dylib。
【解决】:
修改libbbb.dylib的加载路径
install_name_tool -change @rpath/libbbb.dylib libbbb.dylib libaaa.dylib
查看
otool -L libaaa.dylib
libaaa.dylib:
libaaa.dylib (compatibility version 0.0.0, current version 5.10.31)
libccc.dylib (compatibility version 0.0.0, current version 0.0.0)
libbbb.dylib (compatibility version 0.0.0, current version 0.0.0)
再启动就成功加载了。