2011-06-09 135 views
1

我在Linux中加载共享库时遇到一个奇怪的问题。在我的应用程序中有两个共享库(假设abc.so和xyz.so)。 abc.so依赖于xyz.so,即每当你尝试加载abc.so时,jvm将首先加载xyz.so.System.load()方法不加载设置LD_LIBRARY_PATH环境变量的共享库

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

任何人都可以帮助我理解这个错误吗?提前致谢!

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

回答

0

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

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

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