静态链接到动态库。 glibc的

时间:2009-01-15 20:06:27

标签: gcc g++ linker glibc

因此。我有一个问题,我在一台机器上有两个版本的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?

3 个答案:

答案 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

相关问题