4

所以。我有一个问题,我在一台机器上有两个版本的 GCC。
3.4.6 和 4.1

这是由于新软件的一些依赖性问题。(需要 glibc 4.1)

当我将这个新软件与 4.1 库链接时,它链接得很好。但是,在执行软件时找不到库,因为它在我的 LD_LIBRARY_PATH 中查看 3.4.6。如果我将 LD_LIBRARY_PATH 设置为 4.1 库,它会炸毁外壳,并杀死其他东西,因为 3.4.6 库用于此目的。

它有点像22。

有没有什么方法可以在链接时提供该共享库的绝对路径而不使用 LD_LIBRARY_PATH?

这样我可以希望有两个版本,但只为这个特定的应用程序使用 4.1?

4

3 回答 3

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:
于 2009-01-15T20:23:13.813 回答
1

不是您问题的真正答案,而是替代解决方案:

您应该能够通过将新的 lib 路径添加到并以 root身份/etc/ld.so.conf运行来解决您的问题。ldconfig

于 2009-01-15T20:55:53.497 回答
0

你不能只为需要它的应用程序设置 LD_LIBRARY_PATH 吗?即不是将其全局设置为导出变量,而是将程序运行为

LD_LIBRARY_PATH=/path/to/4.1/libs my_executabel

?

-k

于 2010-10-16T15:59:10.397 回答