オペレーティング システムは MacOS X、具体的には PowerPC G4 上の 10.5 (Leopard) ですが、10.6 を実行している x86 でも同じ問題があります。
DLL を動的にロードするアプリケーションを作成しています。DLL (これを と呼びましょうfoo.dylib
) は別のアプリケーションの一部であり、ハードディスクの別の場所にあります。私のアプリケーションはプログラムで見つけfoo.dylib
ます(正確な配置は変更される可能性があり、おそらくユーザーは実行中のアプリケーション自体からGUIを介してDLLパスを指定します)。たとえば、アプリケーションがディレクトリ/Application/MyApp.app/Contents/MacOS
にあり、foo.dylib
たまたま にあるとし/Application/OtherApp.app/Contents/MacOS
ます。DLL の読み込みにはdlopen()
.
さて、それfoo.dylib
自体が同じディレクトリにある他のDLLの束を必要としていることがわかりましたが、事前に何も知りません。このような追加の DLL はそれぞれ、.foo.dylib
などのパスで登録され@executable_path/bar.dylib
ます。のセマンティクスは@executable_path
、現在のプロセス実行可能ファイルが見つかったディレクトリに置き換える必要があるということです。これは、私ではなく、OtherApp でうまく機能します。 を開くfoo.dylib
と、 をロードしようとし、正しいディレクトリではないbar.dylib
で検索します。/Application/MyApp.app/Contents/MacOS/bar.dylib
DYLD_FALLBACK_LIBRARY_PATH
回避策は、環境変数をに設定することですが、これはアプリケーションを起動する前/Application/OtherApp.app/Contents/MacOS
に行う必要があります (この環境変数はダイナミック リンカーによって 1 回だけ読み取られます。プログラムで値を変更しても効果はありません)。これは、ファイルの場所の動的検出と互換性がありません。setenv()
putenv()
foo.dylib
の効果をオーバーライドするプログラム的な方法はあります@executable_path
か?