2011-07-15 5 views
5

setenvを使用してDYLD_LIBRARY_PATHを設定していますので、dlopen()を実行すると正しい.dylibを見つけることができますが、dlopen DYLD_LIBRARY_PATHに追加したパスを検索しているようです。setenvを使用してdlopen呼び出しを行う際の問題

私がDYLD_LIBRARY_PATHに行った変更は、自分のプロセスを再実行するまで有効になりません。これは正しいです?

また正しい場合は、DYLD_LIBRARY_PATHを設定して、自分のプロセスをリセットして変更を加えてもらう方法がありますか?

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

ありがとうございます。

答えて

2

私の質問に対する答えは、環境変数dlopenに影響を及ぼすために、LD_LIBRARY_PATHでプロセスを再実行せずにsetenvを使用することはできません。

@exectuable_path、@loader_path、または@rpathを私の.dylbのインストール名のパスとして使うべきであることが判明しました。この方法で、dlopenから.dylibsの相対パス検索を行うことができます。

4

私は、Mac OSのことは知らないが、Linux上で、長い実行可能ランの最初の命令の前に、ローダは一度getenv("LD_LIBRARY_PATH")の値を読み取り、それが離れて保存されます。プログラムによるLD_LIBRARY_PATHのその後の変更は、すべての子プロセスにのみ影響を与えますが、プロセス自身ではなく、execve()です。私はそれがMac OSで似ていると思います。

一般的なやり方は、proces(Javaはこれを行う)、環境を設定してexecを実際のバイナリにするシェルラッパーを使うことです(Firefoxはこれを行います)。

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

+0

現在、私たちのソフトウェアは、余分なパスを使ってLD_LIBRARY_PATHを設定するための再実行を行います。私は再execveなしでそれをやろうとしていましたが、それがMAC OS上の唯一の方法かもしれません。これにより、Xcodeのデバッグが最初の実行と2番目の実行の間で中断されるため、デバッグが非常に困難になります。 –

+0

Javaは再実行IFFを実行しますが、既存のLD_LIBRARY_PATHはまだ正しくありません。あなたのプログラムは同じことをしなければならない、または無限ループに入るでしょう。だから、それをデバッグするには、LD_LIBRARY_PATHを再実行前(おそらくXcodeを起動する前)に設定しておいたものに設定し、デバッグしてください。 –

関連する問題