大师说LD_LIBRARY_PATH不好 - 有什么选择?

SyR*_*ity 25 linux linker

我读了一些关于使用LD_LIBRARY_PATH的问题的文章,甚至作为包装脚本的一部分:

http://linuxmafia.com/faq/Admin/ld-lib-path.html

http://blogs.oracle.com/ali/entry/avoiding_ld_library_path_the

在这种情况下 - 推荐的替代品是什么?

谢谢.

Gil*_*aor 11

您可以尝试添加:

-Wl,-rpath,path/to/lib
Run Code Online (Sandbox Code Playgroud)

到链接器选项.这将节省您担心LD_LIBRARY_PATH环境变量的需要,并且您可以在编译时决定指向特定的库.

对于相对于二进制的路径,可以使用$ ORIGIN,例如

-Wl,-rpath,'$ORIGIN/../lib'
Run Code Online (Sandbox Code Playgroud)

(当使用ld静态链接到共享库时,$ ORIGIN可能不起作用,使用-Wl, - allow-shlib-undefined来修复此问题)


cor*_*ttk 7

我总是设置LD_LIBRARY_PATH,我从来没有遇到过问题.

引用第一个链接:

我什么时候应该设置LD_LIBRARY_PATH?简短的回答永远不会.为什么?有些用户似乎设置了这个环境变量,因为来自其他用户的错误建议或者他们不知道如何解决的链接错误.

不是我所说的最终问题陈述.事实上,想到我不喜欢它.[YouTube,但SFW].


第二篇博客文章(http://blogs.oracle.com/ali/entry/avoiding_ld_library_path_the)更加关注问题的本质......简而言之,似乎是库版本冲突,ThisProgram需要Foo1. 2,但ThatProgram需要Foo1.3,因此你不能运行这两个程序(很容易).请注意,大多数这些问题都被一个简单的包装器脚本所抵消,该脚本只为执行的shell设置LD_LIBRARY_PATH,这几乎总是一个交互式shell的子进程.

另请注意,在帖子中很好地解释了备选方案.

我很困惑为什么你会发布一个问题,其中包含明显回答你问题的文章的链接......你是否有一个特定的问题在这两篇文章中没有涵盖(显然足够)?


Spl*_*iFF 6

答案在你引用的第一篇文章中.

在UNIX中,可以使用编译器的-L dir选项指定库的位置.....作为使用-L和-R选项的替代方法,您可以在编译代码之前设置环境变量LD_RUN_PATH.