构建彼此依赖的共享库(Linux)

时间:2015-01-07 10:40:26

标签: linux build shared libs

我有一堆非常复杂的lib和可执行文件(Linux)。整个系统在过去使用静态库开发,然后几年前lib被迁移到共享库(-fPIC等)。检查我发现的依赖关系,有两个共享库:libA和libB:

  • libA从libB调用一些函数
  • libB从libA调用一些函数

我想构建具有适当依赖关系的lib:libA依赖于libB而libB依赖于libA。但我无法给予" -llibB"到链接器,因为lib在libA的构建时尚未存在

如果我构建没有libB依赖的libA(创建未解析的符号),我必须记住,如果我使用libA,我还必须链接libB,因为libA中有未定义的符号。那是在做什么!

我正在寻找的是构建libA并告诉链接器创建依赖libB而不使用libB的可能性,这可能吗?

如果不将libA和libB合并在一起,如何解决我的问题?

此致 彼得斯


修改 我发现,我可以直接生成一个空的lib(无需编写源代码):

gcc -shared -Wl,-soname,libB.so.$(MAJOR) -o libB.so

然后我可以构建libA,将 -lB 添加到build命令中。之后我删除了libB.so. 最后,安装后libB引用libA,libA引用libB。

当然,MAJOR号码必须与libB的MAJOR匹配,这是因为主要号码对于所有lib都是通用的。

我只是问自己是否有更合适的方法来做这件事?

1 个答案:

答案 0 :(得分:2)

共享库之间的依赖关系在加载时间之前不会解析,因此您可以使用以下行链接:

gcc -shared -Wl,-soname,libA.so.$(AMAJOR) -o libA.so
gcc -shared -Wl,-soname,libB.so.$(BMAJOR) -o libB.so

然后

gcc -o myProgram a.o b.o c.o libA.so libB.so

当你加载(运行)myProgram时,动态加载器将遵循不满足的依赖关系并在两个共享对象中查找符号。 -shared选项实际上是一个非抱怨 - 未解决的符号标志,它允许构造一个没有所有已解析符号的ELF文件。

这里可能发生的另一件事是libreries没有安装。您正在尝试在没有正确路径的情况下执行它们,并在执行时获取未解析的符号(来自myProgram)。一种解决方案是使用以下命令运行myProgram:

LD_LIBRARY_PATH=. myProgram

export LD_LIBRARY_PATH=/path/to/libraries
myProgram

在linux中,库被缓存在系统数据库中,因此加载共享库很快。数据库由soname编制索引,要重新生成数据库,您必须以root身份使用命令 ldconfig(8)

ldconfig

其他环境可能根本不使用 ldconfig(8)(以solaris为例)