23

我无法弄清楚为什么我的二进制文件没有加载。它是由 MATLAB 加载的 dylib(MEX 文件),并链接到不同位置的许多 dylib。MATLAB 告诉我它无法加载 MEX 文件,但我无法弄清楚它找不到哪些依赖项。

有人对如何调试这样的东西有任何建议吗?

在 Linux 上,ldd是调试此问题的完美工具。人们一直说otool -LMacOS相当于Linux ldd,但事实并非如此。ldd实际上会查找库,并告诉您可以找到哪些库,以及在哪里找到它们。otool -L只告诉您需要链接哪些库。它不会努力检查它们是否在那里。它甚至不会告诉您使用@rpath.

otool -l(小写 L)为您提供“加载命令”的转储,在那里您可以看到LC_RPATH命令,这些命令确定了@rpath搜索库的位置。但是这些无法向我解释找不到哪个依赖项。

4

2 回答 2

21

在运行 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
于 2017-08-02T20:52:59.163 回答
10

使用可执行文件时,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=$1 \
./true
rm ./true

可以将脚本调用为

my-ldd ./foo.dylib

或(使用 rpath 尝试回显)

my-ldd -r ./foo.dylib
于 2019-05-22T02:42:54.353 回答