【问题标题】:GNU/Debian Linux and LDGNU/Debian Linux 和 LD
【发布时间】:2012-01-08 06:39:36
【问题描述】:

假设我有一个大型项目,其中包含多个动态库,这些库都将安装到 /usr/lib 或 /usr/lib64。现在假设其中一个库调用了另一个已编译库。如果我将两个相互依赖的库放在同一个位置,ld 程序是否能够允许这两个库相互调用?

【问题讨论】:

    标签: linux libraries ld dynamic-library


    【解决方案1】:

    是的,只要它们的位置存在于ld 搜索库的目录集中。您可以使用LD_LIBRARY_PATH 环境变量覆盖此集。

    请参阅this 手册,它将解决您的问题。

    【讨论】:

      【解决方案2】:

      答案可能是肯定的,但是在两个库之间有循环引用是一个非常糟糕的设计(即liba.so包含函数fa,从libb.so调用函数fb ,从liba.so调用函数ga)。

      您应该将两个库合并为一个libbig.so。别担心,图书馆可能很大。 (一些公司拥有数百兆字节代码的 Linux 库)。

      Debian 上 binutils-gold 包中的 gold 链接器应该对您有用。它比 binutils 的旧链接器运行得更快。

      【讨论】:

        【解决方案3】:

        如果您指的是运行时动态链接器 /lib/ld-linux*(相对于 /usr/bin/ld),它将在您的 LD_LIBRARY_PATH 中查找库,通常包括 /usr/lib 和 /usr/lib64 .

        通常,/lib/ld-* 用于运行时的 .so 库; /usr/bin/ld 在编译时用于 .a 库。

        但是,如果您的库使用 dlopen() 或类似方法来查找另一个库(例如插件),它们可能具有其他查找另一个库的机制。例如,许多插件系统会使用 dlopen 读取某个(一个或多个)目录中的每个库。

        【讨论】:

          猜你喜欢
          • 2019-07-29
          • 2019-02-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多