繁体   English   中英

链接到静态库的多个版本

[英]linking to multiple versions of a static library

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

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

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

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

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

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

  1. 编译A的版本2
  2. 针对A2编译库B.
  3. 将B和A2合并到单个库C中(有关相关讨论,请参阅此页 )。
  4. 通过使用objcopy创建C2来本地化来自A2中的所有符号。 使用objcopy --localize-symbols infile outfile ,并在此处查看详细信息。
  5. 编译A的版本1
  6. 编译您的应用程序(P)。
  7. 链接P A1和C2。

我在实践中从未这样做过,但所有构建模块似乎都已到位。 第4步是最难的,因为你必须识别所有冲突的符号 - 可能是手动的。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM