首页 > 解决方案 > 将静态库与具有相同原型但用途不同的函数链接

问题描述

我处于一个奇怪的情况,我需要两个函数,具有相同的原型,在我的程序中服务于不同的目的。

我的程序引用了 GNU 的二进制文件描述符包中的函数libbfd.a,它是从binutils. 我需要两个libbfd.a用于两个目标(例如 ARM 和 RISC-V)。显然,在这两个 ' 的副本中libbfd.a,会有很多函数具有相同的原型(因为它们是从相同的 生成的binutils),但服务于不同的目的(因为它们的目标不同)。

我不能简单地将我的程序与这两个链接libbfd.a。我的最终程序中只包含了一个函数副本,因为...

静态库的主要特点是符号索引允许您仅链接那些libbfd.a提供缺失符号的成员。

我无法将静态库分解为目标文件。链接时会multiple definitions of ...出错。

无论哪种方式,函数的两个副本都不能同时存在于我的程序中。

最终,这种情况是否有一个优雅而简单的解决方案?

标签: c

解决方案


这种情况有一个优雅而简单的解决方案吗?

解决方案:

  1. 编写 2 个在客户端-服务器架构中工作的程序。运行两台服务器,每台服务器与不同的静态库风格链接并在不同的套接字上侦听。客户端做这项工作,当他想要对特定风格的工作进行工作时bds,他会调用其中一个服务器来完成工作。

您可能会推出自己的协议或研究一些现有的RPC并使用protobuffers或类似的东西。

  1. 编译libbfd.a成一个共享库并用于dlopen单独引用每个共享库风格。

  2. 用于objcopy重命名一个静态库中的所有符号,并为您自己的头文件提供重命名的符号并正常链接。

我无法将静态库分解为目标文件。

静态库是目标文件的存档。您始终可以将其解压缩为目标文件。


推荐阅读