【问题标题】:Building of shared libs which depend on each other (Linux)构建相互依赖的共享库(Linux)
【发布时间】:2015-03-05 05:39:24
【问题描述】:

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

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

我想构建具有适当依赖关系的库:libA 依赖于 libB,而 libB 依赖于 libA。但我不能给链接器“-llibB”,因为在 libA 的构建时 lib 还不存在

如果我在不依赖 libB 的情况下构建 libA(创建未解析的符号),我必须记住,如果我使用 libA,我还必须链接 libB,因为 libA 中有未定义的符号。真烦人!

我正在寻找的是一种可能性来构建 libA 并告诉链接器创建对 libB 的依赖关系而此时没有 libB,这可能吗?

如何在不将 libA 和 libB 合并的情况下解决我的问题?

问候, 彼得斯


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

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

然后我可以构建 libA,在构建命令中添加:-lB。之后我删除了 libB.so。 最后,安装后libB指libA,libA指libB。

当然,MAJOR 编号必须与 libB 的 MAJOR 匹配,这是这​​样的,因为所有 lib 的主编号都是通用的。

我只是问自己有没有更合适的方法呢?

【问题讨论】:

  • 我认为这是一个设计错误。 libA.solibB.so 应该合并成一个libAB.so
  • 不,他们可以彼此独立生活。请在下面查看我的答案。
  • 他们也许可以“独立”,但他们不应该(因为实际上他们都依赖于另一个)。
  • 是的,你是对的,也许其他原因要求他们独立。我试图想象一个场景,但演示也不是一件容易的事。

标签: linux build shared libs


【解决方案1】:

共享库之间的依赖关系直到加载时才解决,因此您可以使用以下行链接:

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 选项实际上是一个 non-complaint-about-unresolved-symbols 标志,它允许构造一个没有所有已解析符号的 ELF 文件。

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

LD_LIBRARY_PATH=. myProgram

export LD_LIBRARY_PATH=/path/to/libraries
myProgram

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

ldconfig

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-11-22
    • 1970-01-01
    • 2014-03-22
    • 2012-08-11
    • 2011-10-01
    • 2016-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多