如何在Linux中设置环境变量LD_LIBRARY_PATH

331
我首先执行了命令:export LD_LIBRARY_PATH=/usr/local/lib 然后我打开了.bash_profile文件:vi ~/.bash_profile。 在这个文件中,我添加了以下内容:
LD_LIBRARY_PATH=/usr/local/lib
export LD_LIBRARY_PATH

如果终端关闭并重新启动,输入echo $LD_LIBRARY_PATH将不会显示任何结果。
如何永久设置路径?

18
很明显,这里是在指出一个显而易见的事实……如果你只想修复你所做的事情,添加一个 $,例如 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH - Cookie
19
执行完上述操作后,只需运行 sudo ldconfig 即可。 - Necktwi
1
这可能有点傻,但你执行了 $ source ~/.bash_profile 吗?我经常会忘记。然后像 @neckTwi 说的那样运行 ldconfig。 - ashley
12个回答

281

你应该增加关于你的发行版的更多细节,例如在Ubuntu下正确的方法是添加一个自定义的.conf文件到/etc/ld.so.conf.d,例如:

sudo gedit /etc/ld.so.conf.d/randomLibs.conf

在该文件中,您需要编写包含您希望添加到系统的所有库的目录的完整路径,例如:

/home/linux/myLocalLibs

记得只添加目录路径,而不是文件的完整路径,该路径内的所有库将自动索引。

保存并运行sudo ldconfig以使用这些库更新系统。


1
抱歉没有提到发行版。它是Fedora 16。 - singha
16
这真的是正确的方式吗?假设您有多个用户在构建本地库,并且您将它们都添加到了/etc/ld.so.conf.d。现在,用户A可以链接到用户B的本地库。不太好。 - ergosys
4
通常情况下/usr/local/lib已经存在,因此不需要编辑任何文件,只需运行sudo ldconfig即可。 - alexia
2
这真是一个救命稻草,解决了以下问题:在SageMaker中尝试导入psycopg2时出现'ImportError: libpq.so.5: cannot open shared object file: No such file or directory错误。使用以下命令找到路径: $ find ~/ -name libpq.so.5然后使用@user1824407的建议: sudo vim /etc/ld.so.conf.d/pyscopg.conf 接着是libpg.so.5的SageMaker位置: /home/ec2-user/anaconda3/envs/JupyterSystemEnv/lib/ 最后运行sudo ldconfig。神奇的事情发生了。 - MorningHacker
2
这对我没有用,因为之后,即使重新启动后,echo $LD_LIBRARY_PATH仍为空...(Ubuntu 20.04) - Hyperplane
显示剩余5条评论

221

保留以前的路径,不要覆盖它:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/

您可以将其添加到您的~/.bashrc文件中:

echo 'export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/your/custom/path/' >> ~/.bashrc

1
不知道为什么,在相同的代码和文件权限下,直到我进行了这个小改变:mv ~/.bashrc ~/.bash_profile,它才起作用。这是在Ubuntu 20.04.1 LTS上。如果没有这个文件重命名,重新登录后LD_LIBRARY_PATH仍将为空。.bashrc对用户来说是rwx的,所以应该可以正常执行。手动执行也无法设置LD_LIBRARY_PATH(有点意料之外),而源它(. ./.bashrc)则可以设置它。非常奇怪,我认为这可能是Ubuntu 20.04.1 LTS特有的问题。 - Roel Van de Paar

46

/etc/environment中添加

LD_LIBRARY_PATH="/path/you/want1:/path/you/want/2"

参见Ubuntu文档

更正:我应该听取自己的建议并仔细阅读文档。文档指出,这不适用于LD_LIBRARY_PATH:自Ubuntu 9.04 Jaunty Jackalope起,不能在$HOME/.profile、/etc/profile或/etc/environment文件中设置LD_LIBRARY_PATH。必须使用/etc/ld.so.conf.d/.conf配置文件。*

user1824407的答案是正确的。


哇,我看了那个页面好几次都没注意到。感谢你发现并引起我们的注意。 - Michael Scheper
5
在这里,Ubuntu是一个特殊情况。Ubuntu的观点是所有用户都希望使用相同的库,并且每个库只有一个位置(请参阅Launchpad bug #366728中的讨论)。然而,在多用户研究或开发系统中,你希望每个用户能够拥有他们自己的库版本。大多数Linux发行版允许这样做,并且已经这样做了很多年。 - Joachim Wagner
12
花了4个小时试图弄清楚为什么我可以设置PATH和PKG_CONFIG_PATH,但无法设置LD_LIBRARY_PATH。我真是无语了。 - Mikhail Cheshkov
@JoachimWagner 是的,这是正确的,这也是为什么conda和/或bioconda或virtenv现在是调用特定程序并使用特殊环境变量的首选方法。通过使用封装的环境,无意中设置LD_LIBRARY路径将不会产生系统性问题。 - Andor Kiss

38

2
是的,我同意spt025的观点 - 我从来不知道那个技巧是可能的。我感觉有很多东西都被隐藏在一些古老的manpage中...所以StackOverflow对于那种特定类型的信息非常有帮助。 - shevy

25

.bash_profile文件仅由登录shell执行。您可能需要将其放在〜/ .bashrc中,或者只需注销并再次登录即可。


谢谢Joachim Pileborg。我已经重新启动了系统,现在它的路径已经永久设置好了。 - singha

18

由于某些原因,没有人提到编辑bashrc文件后需要重新加载的事实。您可以注销并重新登录(如上所述),但您也可以使用以下命令:source ~/.bashrc. ~/.bashrc


16
export LD_LIBRARY_PATH=/usr/local/lib添加到~/.bashrc中[最好放在脚本的结尾以避免中间任何覆盖,默认的~/.bashrc带有许多if-else语句]。
这样,每当您打开新的终端/konsole时,LD_LIBRARY_PATH将会被反映出来。

抱歉没有提到发行版。 它是Fedora 16。 - singha

9
  1. 进入主目录并编辑 .profile 文件。
  2. 在文件末尾添加以下行:

    export LD_LIBRARY_PATH=<your path>

  3. 保存并退出。

  4. 执行以下命令:

    sudo ldconfig


5

您可以尝试在/etc/profile.d中添加一个自定义脚本,例如myenv_vars.sh

cd /etc/profile.d
sudo touch myenv_vars.sh
sudo gedit myenv_vars.sh

将此添加到空文件中,并保存。
export LD_LIBRARY_PATH=/usr/local/lib

注销并登录后,LD_LIBRARY_PATH 将会被永久设置。


1
很棒的答案。在系统初始化期间每次导出路径是我最好的选择,比物理编辑 /etc/bashrc 更安全。 - Joseph

3

我在Mint 15到17中执行以下操作,也适用于Ubuntu Server 12.04及以上版本:

sudo vi /etc/bash.bashrc 

滚动到底部并添加:

export LD_LIBRARY_PATH=.

所有用户都添加了环境变量。


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