【发布时间】:2012-01-08 06:39:36
【问题描述】:
假设我有一个大型项目,其中包含多个动态库,这些库都将安装到 /usr/lib 或 /usr/lib64。现在假设其中一个库调用了另一个已编译库。如果我将两个相互依赖的库放在同一个位置,ld 程序是否能够允许这两个库相互调用?
【问题讨论】:
标签: linux libraries ld dynamic-library
假设我有一个大型项目,其中包含多个动态库,这些库都将安装到 /usr/lib 或 /usr/lib64。现在假设其中一个库调用了另一个已编译库。如果我将两个相互依赖的库放在同一个位置,ld 程序是否能够允许这两个库相互调用?
【问题讨论】:
标签: linux libraries ld dynamic-library
是的,只要它们的位置存在于ld 搜索库的目录集中。您可以使用LD_LIBRARY_PATH 环境变量覆盖此集。
请参阅this 手册,它将解决您的问题。
【讨论】:
答案可能是肯定的,但是在两个库之间有循环引用是一个非常糟糕的设计(即liba.so包含函数fa,从libb.so调用函数fb ,从liba.so调用函数ga)。
您应该将两个库合并为一个libbig.so。别担心,图书馆可能很大。 (一些公司拥有数百兆字节代码的 Linux 库)。
Debian 上 binutils-gold 包中的 gold 链接器应该对您有用。它比 binutils 的旧链接器运行得更快。
【讨论】:
如果您指的是运行时动态链接器 /lib/ld-linux*(相对于 /usr/bin/ld),它将在您的 LD_LIBRARY_PATH 中查找库,通常包括 /usr/lib 和 /usr/lib64 .
通常,/lib/ld-* 用于运行时的 .so 库; /usr/bin/ld 在编译时用于 .a 库。
但是,如果您的库使用 dlopen() 或类似方法来查找另一个库(例如插件),它们可能具有其他查找另一个库的机制。例如,许多插件系统会使用 dlopen 读取某个(一个或多个)目录中的每个库。
【讨论】: