我确实有一个需要链接的应用程序libjvm
(JDK 中的库需要进行 JNI 绑定)。当我说出地点时libjvm.dylib
using -L
它成功编译和链接。但是,当我运行二进制文件时,我得到:
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 库来说可能是特殊的吗?
以下是我为了构建而所做的事情:
ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre/lib/server -o mybinary
来自苹果的dyld 手册页 https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man1/dyld.1.html:
@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.
你需要通过-rpath path/containing/the/library
to ld
当链接你的二进制文件时告诉它在扩展时在哪里搜索@rpath/
共享库加载命令中的前缀。通过 GHC,您可以使用-optl-Wl
让它传递标志的参数ld
,所以你需要像这样调用 GHC:
ghc --make Main.hs mycbinding.o -ljvm -L<javahome>/jre/lib/server -optl-Wl,-rpath,<javahome>/jre/lib/server -o mybinary
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)