0

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

4

3 回答 3

3

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

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

Debian 上的软件包中的gold链接器binutils-gold应该对您有用。它的工作速度比来自binutils.

于 2011-11-28T20:50:55.227 回答
2

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

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

于 2011-11-28T20:50:21.810 回答
1

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

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

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

于 2011-11-28T21:03:29.147 回答