我读了一些关于使用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来修复此问题)
我总是设置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的子进程.
另请注意,在帖子中很好地解释了备选方案.
我很困惑为什么你会发布一个问题,其中包含明显回答你问题的文章的链接......你是否有一个特定的问题在这两篇文章中没有涵盖(显然足够)?
答案在你引用的第一篇文章中.
在UNIX中,可以使用编译器的-L dir选项指定库的位置.....作为使用-L和-R选项的替代方法,您可以在编译代码之前设置环境变量LD_RUN_PATH.