当前位置: 首页 > 知识库问答 >
问题:

使用java.library.path和LD_LIBRARY_PATH的区别

花品
2023-03-14
-Djava.library.path=/path 
export LD_LIBRARY_PATH=/path 

共有1个答案

朱伯寅
2023-03-14

第一种形式

-Djava.library.path=/path

将在java字节码级别处理,system.loadLibrary将调用runtime.loadlibary,然后调用java/lang/classloader.loadLibrary。在函数callclassloader.loadLibrary中,将检查系统属性java.library.path以获取库的完整路径,并将此完整路径传递给本机代码以调用系统apidlopen/dlsym,最终加载库。您可以从OpenJDK存储库中浏览源代码。下面的代码段是我从链接中复制的段。

这种表单的优点是,如果库路径有问题,您将在Java代码中得到错误、警告或异常。

// Invoked in the java.lang.Runtime class to implement load and loadLibrary.
static void loadLibrary(Class fromClass, String name,
                        boolean isAbsolute) {
    ClassLoader loader =
        (fromClass == null) ? null : fromClass.getClassLoader();
    if (sys_paths == null) {
        usr_paths = initializePath("java.library.path");
        sys_paths = initializePath("sun.boot.library.path");
    }
    if (isAbsolute) {
        if (loadLibrary0(fromClass, new File(name))) {
            return;
        }
        throw new UnsatisfiedLinkError("Can't load library: " + name);
    }
// ....
export LD_LIBRARY_PATH=/path
 dlopen()
   The function dlopen() loads the dynamic library file named by the null-terminated string filename and returns an opaque  "handle"  for  the
   dynamic  library.   If  filename is NULL, then the returned handle is for the main program.  If filename contains a slash ("/"), then it is
   interpreted as a (relative or absolute) pathname.  Otherwise, the dynamic linker searches for the library as follows (see ld.so(8) for fur‐
   ther details):

   o   (ELF  only)  If  the  executable  file for the calling program contains a DT_RPATH tag, and does not contain a DT_RUNPATH tag, then the
       directories listed in the DT_RPATH tag are searched.

   o   If, at the time that the program was started, the environment variable LD_LIBRARY_PATH was defined to contain a colon-separated list of
       directories, then these are searched.  (As a security measure this variable is ignored for set-user-ID and set-group-ID programs.)
 类似资料:
  • 问题内容: 设置JVM参数之间有区别吗 在JVM启动并设置Linux环境变量时 JVM启动之前? 两种方法的优点/缺点是什么? 问题答案: 第一种形式 将在java字节码级别处理,先调用,然后再调用。在函数call中,将检查system属性以获取库的完整路径,并将此完整路径传递给本机代码以调用system api ,最终使库被加载。您可以从OpenJDK存储库浏览源。以下代码段是我从链接中复制的段

  • 问题内容: 我在 链接 时遇到问题(此问题与运行时无关)。 运行make时,链接线如下所示(这是使用g ++版本4.1.x的Linux系统): 这些选项引用共享库(例如libabc.so),这些共享库位于选项指定的目录中。这些目录也出现在中。使用该配置,链接成功,并且我可以运行该应用程序。 如果我从中删除目录,则会得到一条错误行,例如: 另一方面,如果从选项列表中删除目录,则会收到许多警告,例如:

  • 问题内容: 我在/ usr / local / lib /目录中有一些使用JNI构建的库文件。 如果我从午餐人员启动Eclipse,则Eclipse永远不会选择该路径,因此我需要为Run Configurations指定- Djava.library.path。 但是如果我从命令行启动Eclipse。看来工作正常。 有谁知道它为什么如此运行以及如何将其配置为午餐盒中的/ usr / local /

  • 问题内容: 我参与开发一个Java项目,该项目使用一些C ++组件,因此我需要Jacob.dll。(在Windows 7上) 无论我把Jacob.dll放在哪里,我都在不断获取。 我在寻找可能的决定,而到目前为止尚未尝试的决定是设置LD_LIBRARY_PATH变量,指向.dll文件。 我经验不足,不熟悉该变量的含义和用法-您能帮我吗? 问题答案: 通常,您必须在JVM的命令行上进行设置:

  • 使用和有什么区别,还是它们相同?

  • Highcharts 区域图 以下实例演示了使用区间和线的区域图。 我们在前面的章节已经了解了 Highcharts 基本配置语法。接下来让我们来看下其他的配置。在 chart 中修改 type 属性。 chart 配置 将 chart 的 type 属性设置为 arearange,chart.type 描述了图表类型。默认值为 "line"。 var chart = { type: 'a