如何在macOS上设置LD_LIBRARY_PATH/DYLD_LIBRARY_PATH

6
在macOS Catalina上, '''echo $VARIABLE''' 我可以看到变量的值,但是Java无法读取系统变量。 enter image description here 在Linux中没有问题,所以我认为这是一个zsh的问题。 Java可以读取所有变量env,除了LD_LIBRARY_PATHDYLD_LIBRARY_PATH
2个回答

9

如果启用了“系统完整性保护”(SIP),则在 macOS 上,变量 LD_LIBRARY_PATH / DYLD_LIBRARY_PATH 不会传递到子进程的环境中。

确认方法:

#!/bin/zsh

cat << EOF > EnvDemo.java
public class EnvDemo {
   public static void main(String[] args) throws Exception {
      System.out.println(System.getenv("LD_LIBRARY_PATH"));
      System.out.println(System.getenv("DYLD_LIBRARY_PATH"));
      System.out.println(System.getenv("PATH"));
      System.out.println(System.getenv("CUSTOM_FLAG"));
   }
} 
EOF

javac EnvDemo.java
export LD_LIBRARY_PATH=/usr/local/library
export DYLD_LIBRARY_PATH=/usr/local/library
export CUSTOM_FLAG=custom_flag
java EnvDemo
# null
# null
# /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/oracle-19-5
# custom_flag

echo "env | grep LD_LIBRARY_PATH"
env | grep LD_LIBRARY_PATH
# No output here
echo "env | grep DYLD_LIBRARY_PATH"
env | grep DYLD_LIBRARY_PATH
# No output here

1
有点晚了。遇到了同样的问题,并使用符号链接解决了它。在这里查看:https://wissel.net/blog/2022/01/maven-jna-macos-and-ld_library_path.html - stwissel

0

我相信在一个进程中的任何给定环境变量不一定会被复制到从它生成的任何进程中。

因此,在这里,您的zsh进程明显具有LD_LIBRARY_PATH环境变量,但是您的java进程没有。

如果您像这样设置:

LD_LIBRARY_PATH=/Applications/blabla

您将获得此行为。 您要寻找的是:

export LD_LIBRARY_PATH=/Applications/blabla


只有LD_LIBRARY_PATH和DYLD_LIBRARY_PATH这两个变量名会出现问题。我尝试了其他的变量名,所有其他变量都没有问题。 - mcolak
1
检查您的 java 可执行文件(运行 which java)。它可能是一个 shell 脚本,在运行真正的 java 之前设置了 LD_LIBRARY_PATH - okapi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接