我的项目链接到静态库 libA.a 版本 1。
此可执行文件还链接到另一个静态库 B。B 链接到 A,但版本 2。
A 的版本 1 和版本 2 中的两个符号集是相同的。 如果我知道在我的项目和 B 之间没有共享任何与 A 相关的内容,这是否可行?
我设法手动链接它,它似乎可以工作(也许有我不知道的陷阱)。
我无法将库 B 设为共享对象,也无法将 A 用作共享对象。实际上,我只知道 B 正在静态使用 A,因为我和写 B 的人谈过。
最佳答案
我有待纠正,但您似乎可以通过仔细的编译过程和明智地使用 objcopy 来完成您想要的。您应该遵循的步骤是:
- 编译 A 的版本 2。
- 针对 A2 编译库 B。
- 将 B 和 A2 合并为一个库 C(相关讨论参见 this page)。
- 通过使用 objcopy 创建 C2,将 A2 中存在于 C 中的所有符号本地化。使用
objcopy --localize-symbols infile outfile
,然后查看 here了解详情。 - 编译 A 的版本 1。
- 编译您的应用 (P)。
- 链接 P A1 和 C2。
我从未在实践中这样做过,但所有构建基 block 似乎都已就位。第 4 步是最难的,因为您必须识别所有冲突的符号 - 可能是手动的。
关于c - 链接到静态库的多个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931368/