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