【问题标题】:System.load() method not loading shared libraries whithout setting LD_LIBRARY_PATH environment variableSystem.load() 方法在不设置 LD_LIBRARY_PATH 环境变量的情况下不加载共享库
【发布时间】: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。

【问题讨论】:

    标签: linux shared-libraries environment-variables


    【解决方案1】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-02-10
      • 2013-07-28
      • 2023-04-01
      • 2022-09-28
      • 2018-04-05
      • 2012-01-30
      • 2017-11-11
      • 1970-01-01
      相关资源
      最近更新 更多