【问题标题】:Cannot Open Shared Object file - C++ library in Java无法打开共享对象文件 - Java 中的 C++ 库
【发布时间】:2015-03-23 17:49:57
【问题描述】:

我正在尝试在我的 Java 代码中使用 C++ 编译库。我将java.library.path 设置为/usr/local/lib/,并且在那里安装了库的所有.so 文件。

但是,当我尝试运行 Java 应用程序时,我看到以下内容:

Native code library failed to load. 
java.lang.UnsatisfiedLinkError: /usr/local/lib/libA.so: libB.so.2.4: cannot open shared object file: No such file or directory

但是文件似乎在那里:

ls /usr/local/lib/libB.so.2.4
lrwxrwxrwx 1 root root 20 Jan 24 16:33 /usr/local/lib/libB.so.2.4 -> libB.so.2.4.5

符号链接文件也存在。知道为什么找不到这个库吗?

【问题讨论】:

  • 你跑sudo ldconfig了吗?
  • @ElliottFrisch 刚刚尝试过。它没有帮助
  • 值得检查文件权限。或者您可以使用 strace 来查看它正在尝试做什么。您还可以作为测试 System.load() 确切的文件名并查看是否/如何失败,可能再次在 strace 下。
  • @ElliottFrisch 好的,所以我将/usr/local/lib 添加到/etc/ld.so.conf,然后重新运行,似乎已经解决了问题。
  • 如果有人能详细解释这是如何解决问题的,我很乐意接受这个答案

标签: java c++ java-native-interface shared-libraries


【解决方案1】:

Java 能够加载库 A (libA.so) 的本机代码,并且当它运行该本机代码时,存在对 libB.so 的依赖项(但是,它在那时处于本机代码中 - 在JVM 控制)。此时,您必须使用系统上的本机库。通常的机制是设置LD_LIBRARY_PATH 环境变量使用ldconfig(根据手册页),其中部分说明

ldconfig 创建必要的链接并缓存到最新的 在命令指定的目录中找到的共享库 行、文件 /etc/ld.so.conf 和受信任的目录 (/lib 和 /usr/lib)。缓存由运行时链接器 ld.so 或 ld-linux.so 使用。

【讨论】:

    【解决方案2】:

    如果您使用的是 WebLogic:请确保您在 weblogic 的 wlstart-脚本中有一个名为 USTART_LD_LIB 的系统变量,它会覆盖 LD_LIBRARY_PATH 变量。所以你需要设置这个变量,同时将lib附加到这个变量上,同时设置LD_LIBRARY_PATH

    原因是您不能在手动启动应用程序之前继续导出变量..

    【讨论】:

      猜你喜欢
      • 2011-12-23
      • 2013-04-21
      • 2013-05-05
      • 2015-05-23
      • 2017-05-21
      • 2012-05-24
      • 2014-02-10
      • 2021-01-06
      • 2018-07-03
      相关资源
      最近更新 更多