LD_LIBRARY_PATH和LIBRARY_PATH


159

我正在构建一个简单的C ++程序,我想用它的最新版本临时替换系统提供的共享库,以进行开发和测试。

我尝试设置LD_LIBRARY_PATH变量,但链接器(ld)失败,并显示以下信息:

/ usr / bin / ld:找不到-lyaml-cpp

我期望它能工作,因为根据ld手册页:

链接器使用以下搜索路径来查找所需的共享库:...对于本机链接器,环境变量“ LD_LIBRARY_PATH”的内容...

然后,我尝试设置LIBRARY_PATH,并且有效。

根据GCC手册:

LIBRARY_PATH的值是用冒号分隔的目录列表,非常类似于PATH。当配置为本地编译器时,如果无法使用GCC_EXEC_PREFIX找到特殊的链接器文件,则GCC会尝试搜索指定的目录。当在普通库中搜索-l选项时,使用GCC链接也会使用这些目录(但使用-L指定的目录排在最前面)。

正如(GCC)手册所建议的,LIBRARY_PATH可以工作,因为我与GCC链接。

但..

  • 由于我与gcc链接,为什么错误消息提示为什么调用ld?
  • 具有两个目的相同的变量有什么意义?还有其他区别吗?

Answers:


213

LIBRARY_PATH 由gcc在编译之前用于搜索包含需要链接到程序的静态库和共享库的目录。

LD_LIBRARY_PATH成功编译和链接后,程序将使用该程序搜索包含共享库的目录。

编辑:如下所示,您的库可以是静态的或共享的。如果它是静态的,那么代码将被复制到您的程序中,并且在您的程序被编译和链接之后,您无需搜索库。如果您的库是共享库,则需要将其动态链接到您的程序,并且该库才LD_LIBRARY_PATH开始发挥作用。


14
当然,LD_LIBRARY_PATH仅对动态库有意义
Alex Jasmin 2010年

2
我的观点是,如果我要使用ld进行链接(直接),那么根据ld手册,LD_LIBRARY_PATH将用于搜索包含需要链接到我的程序的库的目录。我必须在这里失去了一些东西..
Georgios的政治日报

2
除非您自己调用ld并将目标文件与库合并,否则它将“继承” gcc传递给它的路径。您可以使用-Xlinker选项覆盖标准gcc。
纳文

5
实际上,LIBRARY_PATH 用于搜索包含静态动态库的目录,而不仅仅是静态库。
微粒

3
是的,这是错误的-区别在于LIBRARY_PATH编译时搜索库(静态或动态),并LD_LIBRARY_PATH在运行时搜索动态库。当然,在运行时,您无需搜索静态库。
Timmmm

47

LD_LIBRARY_PATH程序启动时LIBRARY_PATH进行搜索,链接时进行搜索。

来自评论的警告:


38
注意:链接库时,ld本身不会在LIBRARY_PATH或中查找库LD_LIBRARY_PATH。当这只是gcc所调用ld的是LIBRARY_PATH成为使用。(以艰辛的方式学习。)
Rufflewind 2014年

1
@Rufflewind有趣,但如果您提供任何参考,本该更多。
hmijail哀悼辞职者,2016年

此视图在搜索库的那一刻起区分(链接时间与运行时间),而@Naveen区分搜索的库的类型(静态v动态)。是否有两个视图实际上是相同的(动态:运行时=静态:链接时间),或者在不满足这种对应关系的重要情况下?我猜想在编译时也需要一些有关动态库的知识。
XavierStuvw

13

由于我与gcc链接,为什么错误消息提示为什么调用ld?

处于链接模式时,gcc在内部调用ld。

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.