【问题标题】:Linking a dynamic library (libjvm.dylib) in Mac OS X (rpath issue)在 Mac OS X 中链接动态库 (libjvm.dylib)(rpath 问题)
【发布时间】:2013-01-17 09:02:39
【问题描述】:

我确实有一个需要与libjvm 链接的应用程序(JDK 中的一个库需要进行 JNI 绑定)。当我使用-L 告诉libjvm.dylib 的位置时,它会成功编译和链接。但是,当我运行二进制文件时,我得到:

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

【问题讨论】:

    标签: macos haskell linker java-native-interface ghc


    【解决方案1】:

    来自苹果的dyld man page

    @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 传递给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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-04
      • 2016-05-11
      • 1970-01-01
      • 2013-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多