web-dev-qa-db-ja.com

フルパスでMac上のダイナミックライブラリにリンクする

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

これらのライブラリファイルが存在する場所ですが、他の問題が発生するため、これは避けたいと思います。

20
dzhelil

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 

これを一時的な修正として使用することもできますが、リンカーにフルパスを使用するように設定するより良い解決策はないのでしょうか。

30
dzhelil

DYLD_LIBRARY_PATHの問題のいくつかは、代わりにDYLD_FALLBACK_LIBRARY_PATHを使用することで防ぐことができることに注意してください。これは、デフォルトのパスにライブラリが見つからない場合にのみ使用されます。

7
quazgar

これを制御するには、ldコマンドの-rpathオプションを調べてください。 https://github.com/bimargulies/jni-Origin-testbed のコンテンツにも興味があるかもしれません。これは、いくつかの関連テクノロジーのデモンストレーションです。

ここでの重要なテクニックは次のとおりです。

install_name_tool -change libsl2.so "@loader_path/libsl2.so" libsl1.so
5
bmargulies