LIBRARY_PATH和LD_LIBRARY_PATH的区别

LIBRARY_PATH和LD_LIBRARY_PATH的区别

LIBRARY_PATH和LD_LIBRARY_PATH的区别 #

这两个环境变量都是用来设置库文件的查找路径的,只不过使用的时机不一样。

其中 LIBRARY_PATH 是由链接器来使用的,一般系统默认是 gnu ld。对于大部分开发者来讲,如果 LIBRARY_PATH 没有设置好,在使用 gcc 或者 clang 这些编译器(其实它们都调用了 ld 这个链接器,真正做事情的是 ld)的时候,会碰到类似/usr/bin/ld: cannot find -lfoo的错误。LIBRARY_PATH 的一个等价的选项就是 -L 指定路径的选项。

而另一个 LD_LIBRARY_PATH 的环境变量是由动态链接器来使用的,即我们通过 ldd 看到的 ld-linux-x86-64.so.2 这个库。这个动态链接器是在程序加载运行时执行的。

因此,如果 LD_LIBRARY_PATH 没有设置好的话,会碰到类似./A.exe: error while loading shared libraries: libfoo.so: cannot open shared object file: No such file or directory的问题。

总结下来,LIBRARY_PATH 的使用时机是链接器在做链接的时候, LD_LIBRARY_PATH 的使用时机是在程序运行时。

Viewpoint #

From #

07 | 动态链接(上):地址无关代码是如何生成的?