LD_LIBRARY_PATH在哪里?如何设置LD_LIBRARY_PATH env变量?


26

我正在尝试使用Unix构建C ++程序。

我得到了错误

Linking CXX executable ../../bin/ME
/usr/bin/ld: cannot find -lboost_regex-mt

听说我只需要在我的LD_LIBRARY_PATH env变量中设置libboost *的位置,然后像最初那样通过键入以下内容调用make

-L /usr/lib64 -l boost_regex-mt

要么

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

但是LD_LIBRARY_PATH在哪里?如何设置LD_LIBRARY_PATH env变量?


为什么当您提供大部分有用的上下文来理解您的问题时,您还是要删除大部分问题?
jlliagre 2014年

@jlliagre我同意:如果没有原始问题提供的上下文,则投票最多的答案没有任何意义。我回滚了。
John1024

Answers:


25

如何设置LD_LIBRARY_PATH env变量?

执行此操作时,您已经设置了它:

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/lib64

但这不会解决您的问题。$LD_LIBRARY_PATH在执行时会被查询,以提供其他目录的列表,在这些目录中搜索可动态链接的库。链接时不进行咨询(可能不是寻找内置工具本身所需的库!)。

为了告诉链接器在构建时在哪里可以找到库,您需要使用-L链接器选项。您也已经做到了:

-L /usr/lib64

如果仍然出现错误,则需要确保该库确实存在。您是否有文件libboost_regex-mt.solibboost_regex-mt.a在该(或任何)目录中?请注意,这样的文件libboost_regex-mt.so.othersuffix不计入此目的。如果您没有该库,则可能需要为此库安装发行版的开发包。


在linux下,根据ld(1)手册页,$LD_LIBRARY_PATH还可以参考ld:«5.对于本机链接程序,请搜索环境变量“ LD_LIBRARY_PATH”的内容。»
vinc17 2014年

@csx-您的发行版是什么?Ubuntu,Fedora,CentOS等?看到这里,对于如:stackoverflow.com/questions/15874220/...
SLM

@ vinc17,ld联机帮助页中的引用仅涉及递归依赖性:已经选择要链接到的库的依赖库。它与为正在生成的可执行文件查找库无关。就是-L那样
Celada 2014年

@csx我对科学linux一无所知,但是如果apt-get没有给您提供命令,那么它不是Debian派生的,因此您需要另一种方法来安装缺少的软件包。但这绝对是您的问题所在。
Celada 2014年

晚,但:-Ldir -llib应该工作作为参数传递给ldgcc/g++/etc包括当链接阶段,但原来与恢复Q提到make:与正常makefile文件,你可能需要LDFLAGS="whatever"和一个聪明的makefile文件,你可能需要几乎所有的东西,包括砖在巧妙的makefile笔者抛出。
dave_thompson_085

11

在LD_LIBRARY_PATH中永久添加新路径的另一种方法:

在中编辑.conf文件/etc/ld.so.conf.d/

我曾经安装过一个应用程序,但另一个应用程序无法识别其库。然后,我将路径(即)添加/usr/local/hdf5/libx86_64-linux-gnu.conf文件中。只需放在下一行。保存。

然后跑 sudo ldconfig

有效。

PS:操作系统Ubuntu 14.04


4

您可以在您~/.profile的外壳程序和/或特定的init文件中进行设置(例如,~/.bashrc对于bash,~/.zshenv对于zsh)。然后,您需要重新启动外壳程序(并可能注销并再次登录,具体取决于您的选择)。

您可以使用以下方法检查设置:

env | grep '^LD_LIBRARY_PATH'

编辑:LD_LIBRARY_PATH适用于包含机器代码的共享库,其文件名通常包含.so其名称,可能后跟数字,以句点分隔,以区分不同的版本。尽管存在LD_LIBRARY_PATH,但是由于ABI不匹配而找不到库的情况。还要注意,语言(例如Perl和Python)和软件包可能具有其自己的库系统(可能还包含.so文件),与无关LD_LIBRARY_PATH


我的编译程序仍然抱怨找不到python库,尽管我使用env看到了正确的路径。grep'^ LD_LIBRARY_PATH'。可能是什么问题?
赫尔曼(Herman Toothrot)

@HermanToothrot我已经更新了答案。请注意,python有其自己的库系统。我怀疑它没有使用LD_LIBRARY_PATH(以避免与常规库冲突)。您需要为此提出一个具体问题,并得到错误消息。
vinc17

3

如果库路径错误在链接器中,则在编译期间,您需要将库路径添加到变量$ LD_LIBRARY_PATH中。如果库错误是您实际运行已编译程序时发生的错误,则需要将库路径添加到/etc/ld.so.conf并运行ldconfig来重建库搜索路径高速缓存。


这很棒!我的conf文件指向此目录/etc/ld.so.conf.d,因此只需将包含libs路径的文件添加到该文件夹​​即可。还请确保以root用户身份运行ldconfig(或对其进行sudo)
RLaaa

0

解决:

加入 /etc/systemd/system/pm2-node.service

Environment=PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin:/app/nodejs/local/nvm/versions/node/v7.8.0/bin:/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin
Environment=PM2_HOME=/home/node/.pm2
Environment=LD_LIBRARY_PATH=/opt/oracle/instantclient_12_2
Environment=OCI_LIB_DIR=/opt/oracle/instantclient_12_2
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.