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