5

setenv を使用して DYLD_LIBRARY_PATH を設定しているため、dlopen() を実行すると、.dylib を見つけるための正しいパスが得られますが、dlopen() を実行すると、DYLD_LIBRARY_PATH に追加したパスが検索されないようです。

収集できるものから、DYLD_LIBRARY_PATH への変更は、プロセスが再実行されるまで有効になりません。これは正しいです?

また、それが正しければ、DYLD_LIBRARY_PATH を設定し、プロセスをリセットせずに変更を機能させる方法はありますか。

そうそう、私はこのコードを MAC OSX で書いています。

前もって感謝します。

4

2 に答える 2

5

Mac OS についてはわかりませんが、Linux では、実行可能ファイルの最初の命令が実行されるずっと前に、ローダーがgetenv("LD_LIBRARY_PATH") onceの値を読み取り、それを保存します。LD_LIBRARY_PATHプログラムによるその後の変更は、その子にのみ影響execve()し、プロセス自体には影響しません。Mac OS でも同様だと思います。

これを回避する通常の方法は、プロセスを再execve処理する (Java がこれを行う) か、環境を設定してから実際のバイナリを実行するシェル ラッパーを使用する (Firefox がこれを行う) ことです。

ライブラリ検索パスを更新する Mac OS 固有の方法があるかもしれませんが、Google は一致するものを見つけられないようです。Linuxにはそのようなメカニズムはないと確信しています。

于 2011-07-18T03:29:38.233 に答える
2

私の質問に対する答えは、環境変数が dlopen に影響を与えるために、LD_LIBRARY_PATH でプロセスを再実行しないと setenv を使用できないということです。

@exectuable_path、@loader_path、または @rpath を .dylb のインストール名パスとして使用する必要があることがわかりました。これにより、dlopen から .dylibs の相対パス検索を実行できます。

于 2011-07-25T21:12:22.803 に答える