当前位置:  开发笔记 > 运维 > 正文

链接时LD_LIBRARY_PATH和-L有什么区别?

如何解决《链接时LD_LIBRARY_PATH和-L有什么区别?》经验,为你挑选了3个好方法。

LD_LIBRARY_PATH链接时遇到问题(这个问题与运行时间无关).

当我运行make时,链接行看起来像这样(这是一个使用g ++版本4.1.x的Linux系统):

g++ a.o b.o c.o -o myapp \
 -L/long/path/to/libs/ \
 -L/another/long/path/ \
 -labc -ldef -lghi

-l选项参考存在于由指定的目录共享库(例如,libabc.so)-L选项.这些目录也出现在LD_LIBRARY_PATH.使用该配置,链接成功,我可以运行该应用程序.

如果我从中删除目录LD_LIBRARY_PATH,那么我会得到一个错误行,例如:

/usr/bin/ld: cannot find -labc

另一方面,如果我从-L选项列表中删除目录,那么我会收到许多警告,例如:

/usr/bin/ld: warning: libabc.so, needed by /long/path/to/libs/libxyz.so,
    not found (try using -rpath or -rpath-link)

然后还有更多错误,例如:

/long/path/to/libs/libdef.so: undefined reference to `Foo::Bar::junk(Fred*)'

有人可以解释之间的差异LD_LIBRARY_PATH-L?我想深入了解这些内容,所以非常感谢参考!

另外,我必须添加什么来链接线以避免使用LD_LIBRARY_PATH

编辑:当缺少目录时-L,编译器建议"尝试使用-rpath或-rpath-link".我不认为我以前见过makefile中的那些选项.你呢?不确定这是否有助于解决这个LD_LIBRARY_PATH问题.



1> 小智..:

这个问题有两个答案,部分答案在于编译时链接(即gcc -lfoo -L/usr/lib......反过来调用ld)和运行时链接器查找.

编译程序时,编译器检查语法,然后链接器确保存在执行所需的符号(即变量/方法/等)等.LD_LIBRARY_PATH正如已经指出的那样,通过修改搜索路径,具有改变路径gcc/ ld行为的副作用以及运行时链接器的行为方式.

当您运行程序时,运行时链接程序实际上会提取共享库(如果可能,在磁盘上或从内存中),并加载共享符号/代码/等.再次,LD_LIBRARY_PATH隐式地影响此搜索路径(有时不是一件好事) ,如前所述.)

LD_LIBRARY_PATH在大多数Linux系统上不使用的正确修复方法是添加包含共享库的路径/etc/ld.so.conf(或在某些发行版中,使用/etc/ld.so.conf.d/其中的路径创建文件)并运行ldconfig(/sbin/ldconfig以root身份)更新运行时链接程序绑定缓存.

Debian上的例子:

jewart@dorfl:~$ cat /etc/ld.so.conf.d/usrlocal.conf 
/usr/local/lib

然后,当程序执行时,运行时链接程序将在这些目录中查找已链接二进制文件的库.

如果您想知道运行时链接器知道哪些库,您可以使用:

jewart@dorfl:~$ ldconfig -v 

/usr/lib:
libbfd-2.18.0.20080103.so -> libbfd-2.18.0.20080103.so
libkdb5.so.4 -> libkdb5.so.4.0
libXext.so.6 -> libXext.so.6.4.0

并且,如果您想知道二进制文件链接到哪些库,您可以使用ldd这样的方法,它将告诉您运行时链接程序将选择哪个库:

jewart@dorfl:~$ ldd /bin/ls
linux-vdso.so.1 =>  (0x00007fffda1ff000)
librt.so.1 => /lib/librt.so.1 (0x00007f5d2149b000)
libselinux.so.1 => /lib/libselinux.so.1 (0x00007f5d2127f000)
libacl.so.1 => /lib/libacl.so.1 (0x00007f5d21077000)
libc.so.6 => /lib/libc.so.6 (0x00007f5d20d23000)



2> sateesh..:

设置LD_LIBRARY_PATH具有最高优先级,因此在设置时,LD_LIBRARY_PATH甚至在标准
目录集之前首先搜索所提及的目录集.因此,在您的情况下,设置LD_LIBRARY_PATH正在影响
使用-l选项提到的库的查找.没有LD_LIBRARY_PATH一些依赖项
可能已从标准目录集解析.

虽然设置LD_LIBRARY_PATH了调试帮助并尝试更新版本的
库,但它在一般开发环境设置和部署中的使用被认为是不好的.

有关共享库的更多详细信息,请参阅Linux文档中的HOWTO


说明事情是"糟糕的"而不说它为什么,这绝对是一个"坏"的事情(我可以​​说它为什么).

3> Don Neufeld..:

LD_LIBRARY_PATH用于在运行应用程序时查找共享库.这是一个副作用,它影响你的链接,你不应该依赖它.

作为常常不需要的副作用,LD_LIBRARY_PATH也将在使用-L指定的目录之后的链接(ld)阶段进行搜索(如果没有给出-L标志也是如此).

为什么LD_LIBRARY_PATH是坏的

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有