【发布时间】: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.so和libB.so应该合并成一个libAB.so -
不,他们可以彼此独立生活。请在下面查看我的答案。
-
他们也许可以“独立”,但他们不应该(因为实际上他们都依赖于另一个)。
-
是的,你是对的,也许其他原因要求他们独立。我试图想象一个场景,但演示也不是一件容易的事。