我正在尝试在我的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
符号链接文件也存在。知道为什么找不到这个库吗?
答案 0 :(得分:2)
Java能够加载库A
(libA.so
)的本机代码,当它运行该本机代码时,依赖于libB.so
(但是,它是{s}在本地代码中 - 在JVM控件之外)。此时,您必须使用系统上的本机库。通常的机制是设置LD_LIBRARY_PATH
环境变量或使用ldconfig
(根据手册页)部分说明
ldconfig创建必要的链接并缓存到最新的 在命令中指定的目录中找到的共享库 line,在文件/etc/ld.so.conf和受信任的目录(/ lib 和/ usr / lib)。缓存由运行时链接程序ld.so或ld-linux.so使用。
答案 1 :(得分:1)
如果您使用的是WebLogic:请确保在weblogic的USTART_LD_LIB
-脚本中有一个名为wlstart
的系统变量,该系统变量将覆盖LD_LIBRARY_PATH
变量。因此,您需要设置此变量,还要将lib附加到此变量,并同时设置LD_LIBRARY_PATH
。
原因是您无法在手动启动应用程序之前继续导出变量。