System.load()方法没有加载共享库而没有设置LD_LIBRARY_PATH环境变量

时间:2011-06-09 17:01:04

标签: linux shared-libraries environment-variables

在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 个答案:

答案 0 :(得分:0)

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

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

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