首页 文章

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

提问于
浏览
1

在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

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

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

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

相关问题