繁体   English   中英

System.load-ing依赖库的顺序相反时,出现UnsatisfiedLinkError

UnsatisfiedLinkError when System.load-ing dependent libraries in reverse order

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个动态库libjvm_host.so ,它取决于libsgx_uae_service_sim.solibsgx_urts_sim.so

$ ldd libjvm_host.so 
linux-vdso.so.1 =>  (0x00007ffcc376f000)
libsgx_uae_service_sim.so => not found
libsgx_urts_sim.so => not found
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f37d91fc000)
libstdc++.so.6 => /usr/lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f37d8e7a000)
libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f37d8c64000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f37d889a000)
/lib64/ld-linux-x86-64.so.2 (0x00007f37d9651000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f37d8591000)

这两个依赖项都libjvm_host.so旁边,它说not found的原因是因为我尚未设置LD_LIBRARY_PATH

我试图使用System.load通过它们的绝对路径加载这些库,而不依赖于LD_LIBRARY_PATH ,相反的顺序:

System.load(File(temporaryDirectory, "libsgx_uae_service_sim.so").absolutePath)
System.load(File(temporaryDirectory, "libsgx_urts_sim.so").absolutePath)
System.load(File(temporaryDirectory, "libjvm_host.so").absolutePath)

temporaryDirectory是我解压缩.so的地方。 但是我得到了UnsatisfiedLinkError

java.lang.UnsatisfiedLinkError: /tmp/com.r3.sgx.host-libraries/libjvm_host.so: libsgx_uae_service_sim.so: cannot open shared object file: No such file or directory
    at java.lang.ClassLoader$NativeLibrary.load(Native Method)
    at java.lang.ClassLoader.loadLibrary0(ClassLoader.java:1941)
    at java.lang.ClassLoader.loadLibrary(ClassLoader.java:1824)
    at java.lang.Runtime.load0(Runtime.java:809)
    at java.lang.System.load(System.java:1086)
    at com.r3.sgx.core.host.internal.NativeLoader.loadHostLibraries(NativeLoader.kt:31)

它加载前两个.so ,并在libjvm_host.solibjvm_host.so ,后者取决于前两个。

我在多个地方都读过,这是一种加载彼此依赖的库而不依赖LD_LIBRARY_PATH ,但是我无法使其工作。 我想念什么?

1 个回复

用另一种方式解决了这个问题。 不知道为什么反向加载不起作用,但是以下命令可以:

链接顶级.so时,请添加$ORIGIN的RPATH,如下所示:

ld (...) -rpath "\$ORIGIN"

使用CMake:

target_link_libraries(jvm_host
    (...)
    -Wl,-rpath,"$ORIGIN")

这种特殊的RPATH使加载程序将顶级.so的父目录添加到库路径列表中,这意味着将依赖项与libjvm_host.so同一文件夹中就libjvm_host.so

有了这个System.load(File(temporaryDirectory, "libjvm_host.so").absolutePath本身就像一个魅力。

1 JNI UnsatisfiedLinkError依赖库

我有一个JNI dll以及在带有eclipse的计算机上创建的jar文件。 我正在尝试将此部署到另一台计算机,并且无法通过异常 我有另一个程序可以打印出java.library.path,并且已经验证了该dll所依赖的dll,并且该dll也位于java.library.path中。 ...

2 UnsatisfiedLinkError(找不到依赖库)

我正在编写一个使用JNI的程序,当我在计算机上运行它时,它可以很好地运行,但是如果尝试在另一个计算机上运行它,它将抛出UnsatisfiedLinkError,表示无法找到依赖的库。 我使用Eclipse,并且已经尝试了所有方法(或很多方法,无论您喜欢哪个)。 有人可以告诉我如何解决此问 ...

6 尝试加载JRI时找不到依赖库

我有这段简单的代码试图加载JRI模块。 我将java.library.path作为VM参数传递,但JRI无法加载以下错误: 在此先感谢您的帮助。 ...

2015-01-20 20:33:37 1 1292   r/ jri
暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM