错误:dlopen()库未加载原因:未找到图像

时间:2013-11-04 20:31:34

标签: macos error-handling ipython dlopen

我是这个领域的新手。我的笔记本电脑是Macbook air,软件:OS X 10.8.5(12F45)。我正在运行一个代码,它给出了以下错误:

  

dlopen(/Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so,2):未加载库:/Users/ramesh/offline/build_icerec/lib/libphys-services.dylib     参考自:/Users/ramesh/offline/build_icerec/lib/icecube/phys_services.so     原因:未找到图像

我进行了谷歌搜索并找到了各种答案。我认为有效的方法是使用

  

“ - install_name @ rpath / lib”。

我的问题是,如何在我的案例中使用-install_name @rpath/lib

1 个答案:

答案 0 :(得分:20)

OS X下的共享对象位置有时很棘手。当您直接调用dlopen()时,您可以自由指定库的绝对路径,这可以正常工作。但是,如果你加载一个库,而这个库又需要加载另一个库(看起来像你的情况),你就失去了控制指定库所在位置的直接路径。

您可以在运行主程序之前设置的环境变量,告诉动态加载程序在哪里搜索内容。通常这些都是个坏主意(但您可以通过OS X系统上的 man dyld 命令来阅读它们。)

创建OS X动态库时,会给出一个安装名称;此名称嵌入在二进制文件中,可以使用otool命令查看。 otool -L mach-o_binary将列出您提供文件名的mach-o二进制文件的动态库引用;例如,这可以是主要可执行文件或dylib。

当动态库静态链接到另一个可执行文件(主要可执行文件或另一个dylib)时,找到链接的dylib的预期位置取决于写入其中的位置(当时它是内置的,或之后应用的更改)。在您的情况下,似乎phys_services.solibphys-services.dylib静态链接。首先,运行otool -L phys_services.so以找到dylib所在位置的完全期望值。

install_name_tool命令可用于更改库的预期位置。它可以在它与静态链接之前针对dylib运行(在这种情况下你没有什么可做的),或者它可以针对加载它的可执行文件运行以重写那些期望。这样的命令模式是install_name_tool -change <old_path> <new_path>因此,例如,如果otool -L phys_services.so向您显示/usr/lib/libphys-services.dylib并且您希望移动您在问题中提出的期望,那么您将使用{{1}执行此操作}}

dyld手册页(man dyld)会告诉你如何使用@rpath,以及其他宏@loader_path和@executable_path。