代码之家  ›  专栏  ›  技术社区  ›  Alex

静态链接到动态库。格利伯

  •  4
  • Alex  · 技术社区  · 17 年前

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

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

    当我将这个新软件与4.1库链接时,它链接得很好。但是,在执行软件时,它找不到库,因为它正在我的LD_library_路径中查看3.4.6。如果我将LD_LIBRARY_PATH设置为4.1 lib,它会炸毁shell以及其他一些东西,因为3.4.6库用于此。

    这有点麻烦。

    这样我就有希望拥有这两个版本,但对于这个特定的应用程序只使用4.1?

    3 回复  |  直到 17 年前
        1
  •  7
  •   Johannes Schaub - litb    17 年前

    rpath 正是这样。它将覆盖默认搜索路径和LD_LIBRARY_路径中设置的内容。只需告诉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:
    
        2
  •  1
  •   Hasturkun    17 年前

    这并不是对你问题的回答,而是另一种解决方案:

    /etc/ld.so.conf 跑步 ldconfig 作为根。

        3
  •  0
  •   Ketil    15 年前

    您不能只为需要的应用程序设置LD_LIBRARY_路径吗?

    LD_LIBRARY_PATH=/PATH/to/4.1/libs my_executabel

    -k