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)

再启动就成功加载了。

 

posted @ 2022-04-07 15:40  落叶维扬  阅读(355)  评论(0编辑  收藏  举报