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