バイナリがロードされない理由を理解できませんでした。これはMATLAB(MEXファイル)によってロードされたdylibであり、さまざまな場所にあるかなりの数のdylibにリンクしています。 MATLABは、MEXファイルを読み込めないと言っていますが、どの依存関係が見つからないのかわかりません。
誰かがこのようなものをデバッグする方法について何か提案がありますか?
Linuxでは、ldd
はこの問題をデバッグするのに最適なツールです。 otool -L
はLinuxのldd
と同等のMacOSであると人々は言い続けていますが、これは真実ではありません。 ldd
は実際にライブラリを探し、どのライブラリが見つかり、どこで見つかったかを示します。 otool -L
は、リンクに必要なライブラリのみを示します。それらがそこにあるかどうかを確認するための努力はしません。 @rpath
を使用する場合、ライブラリが検索される場所もわかりません。
otool -l
(小文字のL)は、「ロードコマンド」のダンプを提供します。そこには、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=$1 \
./true
rm ./true
スクリプトは次のように呼び出されます。
my-ldd ./foo.dylib
または(rpathの試行でエコーされます)
my-ldd -r ./foo.dylib