共享库未加载。仅在 root 下加载

共享库未加载。仅在 root 下加载

我有一个可执行文件,它需要一个位于/opt/...文件夹中的共享库。我已将路径包含在下LD_LIBRARY_PATH/etc/environment使用 对其进行了更新source /etc/environment。当我在没有 root 权限的情况下运行此可执行文件时,我收到一条错误消息libxxx.so: cannot open shared object file: No such file or directory。但是当我使用 运行它时sudo,它就可以运行。但是问题是,许可证不在 root 用户下,因此它会引发与许可证相关的错误。我更改了 的权限,以便/opt/...普通用户可以创建和删除文件。但是,这没有帮助。出了什么问题,我该如何修复它?

答案1

/etc/environment在登录期间进行解释。因此,查看所做更改的正确方法/etc/environment是注销并再次登录。

sudo有效是因为它部分模拟以 root 身份登录(sudo -i更准确地模拟登录)。

source /etc/environment不起作用,因为source是一个 shell 命令,它告诉 shell 将给定的文件解释为 shell 脚本。问题是:/etc/environment 不是shell 脚本。它是环境变量名称-值对的格式为:

name="value"

对于 shell 来说,这一行是全局变量,只有 shell 本身才能看到它。从 shell 执行的程序看不到它。定义环境变量的正确方法是使用exportshell 命令:

export name="value"

因此,如果您确实想在不注销的情况下使用您的全新设备LD_LIBRARY_PATH,您应该执行以下命令而不是source /etc/environment

export LD_LIBRARY_PATH="/opt/..."

更新: LD_LIBRARY_PATH/etc/environment由于 而无法设置ssh-agent。有关详细信息,请参阅错误 #47958以及 Ubuntu 维基页面环境变量. 正如 wiki 页面中所述,存在一种解决方法,即使用/etc/ld.so.conf.d

例如,您可以创建/etc/ld.so.conf.d/opt.conf以下内容:

# Paths for my cool libraries
/opt/...

虽然这被列为一种解决方法,但ld.so.conf.d实际上是最适合进行此类设置的地方。

相关内容