链接到静态库的多个版本

时间:2012-12-18 10:52:34

标签: c linux linker cmake

我的项目链接到静态库libA.a版本1.

此可执行文件还链接到另一个静态库B. B链接到A,但版本2。

A版本1和2中的两个符号集都相同。 如果我知道在我的项目和B之间没有任何与A有任何关系的共享,那么这应该有用吗?

我设法手动链接它似乎工作(可能有我不知道的陷阱)。

我不能将lib B作为共享对象,或者使用A作为共享对象。实际上,我只知道B正静静地使用A,因为我和那个写B的人谈过。

2 个答案:

答案 0 :(得分:3)

我有待纠正,但似乎你可以通过仔细的编译过程和明智地使用objcopy来完成你的愿望。您应遵循的步骤是:

  1. 编译A。
  2. 的第2版
  3. 针对A2编译库B.
  4. 将B和A2合并到一个库C中(参见this page进行相关讨论)。
  5. 使用objcopy创建C2,从而本地化存在于C中的所有符号。使用objcopy --localize-symbols infile outfile,然后查看here了解详情。
  6. 编译A。
  7. 的第1版
  8. 编译您的应用(P)。
  9. 链接P A1和C2。
  10. 我在实践中从未这样做,但所有构建模块似乎都已到位。第4步是最难的,因为你必须识别所有冲突的符号 - 可能是手动的。

答案 1 :(得分:2)

关于问题的“链接”部分,实际上静态库没有链接在一起。仅执行链接步骤以获取最终可执行文件。

事实上,您使用A(版本2)的标头编译您的静态库B.然后,您将可执行文件与B和A(版本1)库链接。

只要两个版本的A中的符号相同,就没有编译问题。但你必须知道你的可执行文件实际上只嵌入了&使用A的版本1。