質問

私は、次のコマンドを使って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++でMatlabのdylibファイルが含まれているという事実から茎と信じています。どのように私は完全なパスを使用するようにリンカを強制することができますか?

私は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を使用することによって防止することができることに留意されたいです。 libには、デフォルトのパスで見つけることができない場合にのみ使用されます。

これを制御するためにldコマンドを-rpathオプションを調べてください。また、 https://github.com/bimargulies/jni-originの内容に興味があるかもしれませんいくつかの関連技術のデモンストレーションである、の-testbedます。

ここで重要な技術は、次のとおりです。

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

また、シンボリックリンクを使用することができます!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top