Matlabエンジンを埋め込む(Python拡張)ライブラリを次のコマンド(cmakeを使用して生成)でリンクしています
c++ -mmacosx-version-min=10.6 -bundle -headerpad_max_install_names -o library.so library.o /Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib /Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib -framework Python
その結果
$ otool -L library.so
library.so:
@loader_path/libeng.dylib (compatibility version 0.0.0, current version 0.0.0)
@loader_path/libmx.dylib (compatibility version 0.0.0, current version 0.0.0)
/System/Library/Frameworks/Python.framework/Versions/2.6/Python (compatibility version 2.6.0, current version 2.6.1)
/opt/local/lib/gcc44/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.13.0)
/opt/local/lib/gcc44/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 125.0.0)
ただし、ライブラリを使用しようとすると、次のエラーメッセージが表示されます。
ImportError: dlopen(./library.so, 2): Library not loaded: @loader_path/libmex.dylib
Referenced from: ./library.so
Reason: image not found
この問題は、@loader_path/libeng.dylib
にフルパスを指定しても、リンカーがフルパスを使用するのではなくg++
の形式でmatlabdylibファイルを含むという事実に起因すると思います。リンカにフルパスを使用させるにはどうすればよいですか?
私は1つの解決策が使用することであることを知っています
export DYLD_LIBRARY_PATH=/Applications/MATLAB_R2009b.app/bin/maci64:$DYLD_LIBRARY_PATH
これらのライブラリファイルが存在する場所ですが、他の問題が発生するため、これは避けたいと思います。
install_name_tool
を使用してファイルを手動で変更する
install_name_tool -change "@loader_path/libeng.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libeng.dylib" library.so
install_name_tool -change "@loader_path/libmx.dylib" "/Applications/MATLAB_R2009b.app/bin/maci64/libmx.dylib" library.so
これを一時的な修正として使用することもできますが、リンカーにフルパスを使用するように設定するより良い解決策はないのでしょうか。
DYLD_LIBRARY_PATH
の問題のいくつかは、代わりにDYLD_FALLBACK_LIBRARY_PATH
を使用することで防ぐことができることに注意してください。これは、デフォルトのパスにライブラリが見つからない場合にのみ使用されます。
これを制御するには、ldコマンドの-rpathオプションを調べてください。 https://github.com/bimargulies/jni-Origin-testbed のコンテンツにも興味があるかもしれません。これは、いくつかの関連テクノロジーのデモンストレーションです。
ここでの重要なテクニックは次のとおりです。
install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so