我是这个领域的新手。我的笔记本电脑是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
?
答案 0 :(得分:20)
OS X下的共享对象位置有时很棘手。当您直接调用dlopen()
时,您可以自由指定库的绝对路径,这可以正常工作。但是,如果你加载一个库,而这个库又需要加载另一个库(看起来像你的情况),你就失去了控制指定库所在位置的直接路径。
您可以在运行主程序之前设置的环境变量,告诉动态加载程序在哪里搜索内容。通常这些都是个坏主意(但您可以通过OS X系统上的 man dyld 命令来阅读它们。)
创建OS X动态库时,会给出一个安装名称;此名称嵌入在二进制文件中,可以使用otool
命令查看。 otool -L mach-o_binary
将列出您提供文件名的mach-o二进制文件的动态库引用;例如,这可以是主要可执行文件或dylib。
当动态库静态链接到另一个可执行文件(主要可执行文件或另一个dylib)时,找到链接的dylib的预期位置取决于写入其中的位置(当时它是内置的,或之后应用的更改)。在您的情况下,似乎phys_services.so
与libphys-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。