2013-02-01 90 views
10

libjvm(JNIバインディングを行うために必要なJDKのライブラリ)とのリンケージが必要なアプリケーションがあります。 -Lを使用してlibjvm.dylibの位置を教えると、コンパイルとリンクが正常に行われます。私は私が手にバイナリを実行するときしかし:Mac OS Xで動的ライブラリ(libjvm.dylib)をリンクする(rpath問題)

dyld: Library not loaded: @rpath/libjvm.dylib 
    Referenced from: <my home directory>/./mybinary 
    Reason: image not found 

をこれまでのところ、私はそうのように私のバイナリ指定LD_LIBRARY_PATHを実行できることを発見した:

LD_LIBRARY_PATH=<path to libfolder installation> ./mybinary 

しかし、もちろん、私はそれを望んでいません。なぜ私はアプリケーションを起動するたびに、何度も何度も何度も何度もそれを与えなければならない場合、正確な位置を指定する必要があります。

私はまた、Mac OS X上のダイナミックライブラリは、場所を示す一種のスタンプを取得することを学びました。しかし、私はrpathが何であるかは分かりません(私には変わったようですが、リンク時にどうすれば設定できますか?)。

アプリケーションは、haskellを使用して構築されていますが、同様に、ldを使用してオブジェクトファイルを手動でリンクすることもできます。しかし、私はそのrpathのことに固執しています - それは多分JDKライブラリにとって特別ですか?ここで

私が構築するために何をすべきかです:あなたはld-rpath path/containing/the/libraryを渡す必要が

RPATH/

Dyld maintains a current stack of paths called the run path list. 
    When @rpath is encountered it is substituted with each path in the 
    run path list until a loadable dylib if found. The run path stack 
    is built from the LC_RPATH load commands in the depencency chain 
    that lead to the current dylib load. You can add an LC_RPATH load 
    command to an image with the -rpath option to ld(1). You can even add 
    a LC_RPATH load command path that starts with @loader_path/, and it 
    will push a path on the run path stack that relative to the image 
    containing the LC_RPATH. The use of @rpath is most useful when you 
    have a complex directory structure of programs and dylibs which can be 
    installed anywhere, but keep their relative positions. This scenario 
    could be implemented using @loader_path, but every client of a dylib 
    could need a different load path because its relative position in the 
    file system is different. The use of @rpath introduces a level of 
    indirection that simplies things. You pick a location in your directory 
    structure as an anchor point. Each dylib then gets an install path that 
    starts with @rpath and is the path to the dylib relative to the anchor 
    point. Each main executable is linked with -rpath @loader_path/zzz, 
    where zzz is the path from the executable to the anchor point. At runtime 
    dyld sets it run path to be the anchor point, then each dylib is found 
    relative to the anchor point. 

@:

ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre/lib/server -o mybinary 

答えて

10

Appleのdyld man pageからあなたのバイナリをリンクしてどこに向かうかを伝えるとき共有ライブラリのloadコマンドに接頭辞@rpath/を展開すると、アーチが消えます。 GHCを使用すると、引数を使用してフラグをldに渡すことができるので、次のようにGHCを呼び出すことができます。

ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre/lib/server -optl-Wl,-rpath,<javahome>/jre/lib/server -o mybinary 
関連する問題