8

我有一个需要使用某个闭源 C++ API 的应用程序。这个 API 与一些 Boost、二进制库文件和所有文件一起分发。我喜欢在自己的代码中使用 Boost。我不能只使用他们的 Boost 版本,因为他们没有分发我需要的所有 Boost 部分。我应该如何进行?目标平台是 linux,最终也是 Windows。

  • 我不会跨 API 边界传递 Boost 对象。
  • 我可以将内容编译为目标文件,以便我的代码使用我的boost 标头,而 API 的代码使用它的Boost 标头。这部分看起来很简单。
  • 没有得到:如何将我的代码链接到 我的Boost 库文件,以及 API 的代码到它的Boost 库文件。我是否需要围绕 API 编译我自己的包装器 - 一个标头包含 Boost 的包装器 - 到动态库?(这是我能想到的进行链接的唯一方法。API 的 Boost 库文件中的符号应该与我的 Boost 库文件中的符号相同。我必须分两个阶段进行链接,不是吗?唯一的方法我可以通过制作一个动态库来链接程序的一部分,而不是其余的,不是吗?)
4

3 回答 3

1

给定的可执行文件对于每个符号只能有一段代码。因此,如果他们的库使用 boost v. 1 中的符号 foo 而您使用 boost v. 2 中的相同符号,那么您将遇到冲突。在不改变符号的情况下,没有简单的方法可以消除这种冲突。如果您能够将 boost 代码编译到动态库中,则应该可以使用动态执行,但这似乎有点矫枉过正。

由于在 C++ 中,符号与其类/命名空间发生了混淆,因此您也可以更改其中之一以使符号发生变化。

于 2011-06-16T17:29:12.250 回答
0

api如何与他们使用的boost库链接?他们用它部署了 boost-##.so,还是静态链接?

因此,请在您的 api .so 中运行“objdump -T api.so | grep boost”以检查 api 是否公开了 Boost。

此外,他们可能已经像用户 chrisaycock 提到的那样重命名了 boost 命名空间。使用 c++filt 命令仔细查看通过“objdump -T api.so | grep boost”找到的符号。

如果它是静态链接的并且 boost 符号没有暴露(或被重命名),那么您可以在代码中使用 boost 而无需考虑 API 的 boost。

如果 boost 真的暴露了,我建议只尝试使用 boost。对于使用 boost 的代码,可能不会发生冲突。如果发生这种情况,您可以编译一个新的 boost 并更改您的命名空间名称。只需运行一个 replace-all 脚本,将“namespace boost”替换为“namespace boost_1_46”之类的东西。

于 2011-06-24T06:43:02.687 回答
0

如果您只使用仅头文件的 boost 库,则可以将代码与链接到其他库的代码分开构建。

您正在使用哪些 boost 库?

于 2011-02-02T01:07:46.520 回答