4

実行時にのみパスを知っている Mac にフレームワーク (または dylib) をロードしようとしています。

Windows ソリューション:

  • ライブラリを /DELAYLOAD でリンク
  • ライブラリの関数を使用する直前に、プログラムの現在のディレクトリを dll が存在するディレクトリに変更します。
  • このライブラリから関数を呼び出します。dll は現在のディレクトリからロードされます

Mac では、弱いリンクを使用して、ライブラリがまだ利用可能でなくてもアプリケーションを起動できます。ただし、ライブラリの関数が必要になるとすぐに、「画像が見つかりません」というメッセージが表示され、アプリケーションが中止されます。

ライブラリを探す場所を実行時に Mac ダイナミック リンカーに伝えるにはどうすればよいですか? 「dlopen」は、ライブラリをロードするだけでシンボルを解決しないため、機能しません。rpath を "." に設定します。(現在のディレクトリ) であり、現在のディレクトリの変更は機能しません。一般的な環境変数 (DYLD_LIBRARY_PATH) の設定は、実行時ではなく、実行可能ファイルの実行前に行われた場合にのみ機能します。

他のアイデアはありますか?

4

2 に答える 2

-2

dlopen() を使用してライブラリを開き、次に dlsym() を使用してシンボルを見つけます。動的リンカーに依存している場合は、事前にパスを把握し、rpath または環境変数を使用して設定する必要があります。rpath は相対パスを取ることができるので、それでうまくいくかもしれません... しかし、ここではおそらく dlopen() とその仲間が最善の解決策です (ただし、関数ポインターを使用するように変換するには多少の作業が必要になる場合があります)。

dlopen() などの利点は、同じ (または類似の) コードが他の *nix でも機能することです。

また、OSX 固有の NSAddImage() を見ることもできますが、必要なことも実行する必要があります。

于 2012-12-16T20:42:49.743 に答える