因此。我有一个问题,我在一台机器上有两个版本的GCC 3.4.6和4.1
这是由于新软件的一些依赖性问题。 (需要glibc 4.1)
当我将这个新软件与4.1库链接时,它链接得很好。但是,当涉及到执行软件时,它无法找到库,因为它在我的LD_LIBRARY_PATH中查看3.4.6。如果我将LD_LIBRARY_PATH设置为4.1 lib,它会破坏shell,同时杀死其他东西,因为3.4.6库用于此目的。
它有点像22。
有没有办法在链接时我可以在不使用LD_LIBRARY_PATH的情况下给出该共享库的绝对路径?
这样我希望有两个版本,但只能在这个特定的应用程序中使用4.1?
答案 0 :(得分:7)
你的意思是一个绝对路径,它在程序启动时使用,在寻找库时更受青睐? rpath
就是这样。它将覆盖LD_LIBRARY_PATH中设置的默认搜索路径和内容。告诉gcc将其传递给链接器:
g++ -Wl,-rpath,/usr/lib/my_4.1 -omy_binary *.cpp
您可以让它向您展示搜索处理(使用help
为您提供更多选项):
[js@HOST2 cpp]$ LD_DEBUG=libs ./a.out
5859: find library=libc.so.6 [0]; searching
5859: search path=/usr/lib/my_4.1/tls/i686/sse2:/usr/lib/my_4.1/tls/i686:
/usr/lib/my_4.1/tls/sse2:/usr/lib/my_4.1/tls:
/usr/lib/my_4.1/i686/sse2:/usr/lib/my_4.1/i686:
/usr/lib/my_4.1/sse2:/usr/lib/my_4.1 (RPATH from file ./a.out)
5859: trying file=/usr/lib/my_4.1/tls/i686/sse2/libc.so.6
5859: ....
5859: search cache=/etc/ld.so.cache
5859: trying file=/lib/libc.so.6 (note: found here!)
5859:
答案 1 :(得分:1)
不是你问题的答案,而是另一种解决方案:
您应该能够通过将新的lib路径添加到/etc/ld.so.conf
并以root身份运行ldconfig
来解决问题。
答案 2 :(得分:0)
您不能仅为需要它的应用程序设置LD_LIBRARY_PATH吗? 即而不是将其全局设置为导出变量,将程序作为
运行LD_LIBRARY_PATH = / path / to / 4.1 / libs my_executabel
-k