System.load() 方法在不设置 LD_LIBRARY_PATH 环境变量的情况下不加载共享库

Posted

技术标签:

【中文标题】System.load() 方法在不设置 LD_LIBRARY_PATH 环境变量的情况下不加载共享库【英文标题】:System.load() method not loading shared libraries whithout setting LD_LIBRARY_PATH environment variable 【发布时间】:2011-06-09 17:01:04 【问题描述】:

我在 Linux 中加载共享库时遇到了一个奇怪的问题。我的应用程序中有两个共享库(假设 abc.so 和 xyz.so)。 abc.so 依赖于 xyz.so,即每当您尝试加载 abc.so 时,jvm 将首先加载 xyz.so。

现在,当我通过将 LD_LIBRARY_PATH 设置为包含这两个库的文件夹来加载这些库时,它的工作没有任何问题。但是,当我尝试使用 System.load("%FULL_PATH%/abc.so") 加载 abc.so 时,它没有被加载。以下行显示为错误: 未定义符号:__cxa_pure_virtual。

谁能帮助我理解这个错误?提前致谢!

注意:由于某些项目要求,我无法更改 LD_LIBRARY_PATH,因此我需要使用 System.load() 方法加载 abc.so。

【问题讨论】:

【参考方案1】:

加载失败,因为链接器无法解析对“abc.so”的“xyz.so”依赖。 Linux 加载程序不会自动在与“abc.so”相同的目录中查找“xyz.so”。您需要通过LD_LIBRARY_PATH 环境变量或修改/etc/ld.so.conf 文件明确告诉它在哪里查看。

我没有在 Java 中尝试过,但是在 Python 模块中,当我需要加载 DLL 时,我通常只是在尝试加载库之前立即修改进程的环境变量。这比编写包装脚本或修改主目录的点文件要容易得多。

或者,您也可以按正确的顺序手动加载所有先决条件。但是,您需要确保加载器将所有符号都放在全局符号表中,而不是私下加载它们。不确定 Java 是如何处理的。

【讨论】:

以上是关于System.load() 方法在不设置 LD_LIBRARY_PATH 环境变量的情况下不加载共享库的主要内容,如果未能解决你的问题,请参考以下文章

System.load(String filename)和System.loadLibrary(String libname)的区别

System.load(String filename)和System.loadLibrary(String libname)的区别

System.load 和 System.loadLibrary详解

Java,在classpath中加载本机库

如何解决java调dll报Unable to load library的错误

system.loadlibrary 路径 能带参数吗