c - 链接到静态库的多个版本

标签 c linux linker cmake

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

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

A 的版本 1 和版本 2 中的两个符号集是相同的。 如果我知道在我的项目和 B 之间没有共享任何与 A 相关的内容,这是否可行?

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

我无法将库 B 设为共享对象,也无法将 A 用作共享对象。实际上,我只知道 B 正在静态使用 A,因为我和写 B 的人谈过。

最佳答案

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

  1. 编译 A 的版本 2。
  2. 针对 A2 编译库 B。
  3. 将 B 和 A2 合并为一个库 C(相关讨论参见 this page)。
  4. 通过使用 objcopy 创建 C2,将 A2 中存在于 C 中的所有符号本地化。使用 objcopy --localize-symbols infile outfile,然后查看 here了解详情。
  5. 编译 A 的版本 1。
  6. 编译您的应用 (P)。
  7. 链接 P A1 和 C2。

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

关于c - 链接到静态库的多个版本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13931368/

相关文章:

c++ - C/C++ 不透明指针库

linux - 在bash中执行任意命令

c - 为什么 LD_PRELOAD 技巧对 librt 不起作用?

c++ - 静态成员与静态全局

c++ - 为什么主可执行文件和 dlopen 加载的共享库共享一个命名空间静态变量的拷贝?

c - C语言中如何将10位以上的整数转换为字符串?

c - 用原子替换条件?

c++ - 如何通过 IO 时序测量找到 L1 缓存线大小的大小?

linux - 在查找和移动 Bash 脚本中包含具有相同名称的不同文件

linux - 不通过 QSqlQuery 获取所有 sqlite 编译指示的结果