MacOSX:二进制链接哪些动态库?
MacOSX: which dynamic libraries linked by binary?
我无法弄清楚为什么我的二进制文件没有加载。它是由 MATLAB(MEX 文件)加载的动态库,并且 links 到不同位置的相当多的动态库。 MATLAB 告诉我它无法加载 MEX 文件,但我不知道它找不到哪个依赖项。
有人对如何调试这样的东西有什么建议吗?
在 Linux 上,ldd
是调试此问题的完美工具。人们一直说 otool -L
是等同于 Linux ldd
的 MacOS,但事实并非如此。 ldd
实际上是在寻找库,并告诉您可以找到哪些库,以及它们是在哪里找到的。 otool -L
只告诉您 link 需要哪些库。它不会努力检查它们是否在那里。它甚至不告诉您在使用 @rpath
.
时在哪里搜索库
otool -l
(小写 L)为您提供 "load commands" 的转储,您可以在其中看到 LC_RPATH
命令,这些命令确定在何处搜索 @rpath
库.但是这些都没能给我解释是哪个依赖没有找到。
尝试在 运行 matlab:
之前设置这些环境变量
export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_LIBRARIES_POST_LAUNCH=1
export DYLD_PRINT_RPATHS=1
运行 man dyld
更多的可能性。
您也可以像这样只为 matlab 命令设置变量:
DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 matlab
Rob Mayoff 的回答是处理可执行文件时的一个很好的解决方案。如果您发现需要检查 dylib 的运行时依赖性,以下脚本 my-ldd
可能会有用。
#!/usr/bin/env bash
while getopts "r" OPTION; do
case $OPTION in
r) export DYLD_PRINT_RPATHS=1;;
esac
done
shift $((OPTIND-1))
cp `which true` .
DYLD_PRINT_LIBRARIES=1 \
DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 \
DYLD_INSERT_LIBRARIES= \
./true
rm ./true
其中脚本可以被调用为
my-ldd ./foo.dylib
或(使用 rpath 尝试回显)
my-ldd -r ./foo.dylib
我无法弄清楚为什么我的二进制文件没有加载。它是由 MATLAB(MEX 文件)加载的动态库,并且 links 到不同位置的相当多的动态库。 MATLAB 告诉我它无法加载 MEX 文件,但我不知道它找不到哪个依赖项。
有人对如何调试这样的东西有什么建议吗?
在 Linux 上,ldd
是调试此问题的完美工具。人们一直说 otool -L
是等同于 Linux ldd
的 MacOS,但事实并非如此。 ldd
实际上是在寻找库,并告诉您可以找到哪些库,以及它们是在哪里找到的。 otool -L
只告诉您 link 需要哪些库。它不会努力检查它们是否在那里。它甚至不告诉您在使用 @rpath
.
otool -l
(小写 L)为您提供 "load commands" 的转储,您可以在其中看到 LC_RPATH
命令,这些命令确定在何处搜索 @rpath
库.但是这些都没能给我解释是哪个依赖没有找到。
尝试在 运行 matlab:
之前设置这些环境变量export DYLD_PRINT_LIBRARIES=1
export DYLD_PRINT_LIBRARIES_POST_LAUNCH=1
export DYLD_PRINT_RPATHS=1
运行 man dyld
更多的可能性。
您也可以像这样只为 matlab 命令设置变量:
DYLD_PRINT_LIBRARIES=1 DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 DYLD_PRINT_RPATHS=1 matlab
Rob Mayoff 的回答是处理可执行文件时的一个很好的解决方案。如果您发现需要检查 dylib 的运行时依赖性,以下脚本 my-ldd
可能会有用。
#!/usr/bin/env bash
while getopts "r" OPTION; do
case $OPTION in
r) export DYLD_PRINT_RPATHS=1;;
esac
done
shift $((OPTIND-1))
cp `which true` .
DYLD_PRINT_LIBRARIES=1 \
DYLD_PRINT_LIBRARIES_POST_LAUNCH=1 \
DYLD_INSERT_LIBRARIES= \
./true
rm ./true
其中脚本可以被调用为
my-ldd ./foo.dylib
或(使用 rpath 尝试回显)
my-ldd -r ./foo.dylib