0

我有一堆非常复杂的库和可执行文件(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 合并在一起,如何解决我的问题?

问候,彼得斯


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

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

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

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

我只是问自己是否有更合适的方法来做到这一点?

4

1 回答 1

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 选项实际上是一个 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 为例)

于 2015-01-08T11:54:18.253 回答