使用闭源库分发boost

时间:2011-01-28 04:36:03

标签: c++ boost multiple-versions

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

  • 我不会跨API边界传递Boost对象。
  • 我可以将内容编译为目标文件,以便我的代码使用我的 boost标头,API的代码使用 Boost标头。这部分看起来很简单。
  • API的 Boost库文件的代码。我是否需要围绕API编译自己的包装器 - 一个包装器,其标头包括Boost - 到一个动态库? (这是我能想到的唯一方法来进行链接.API Boost库文件中的符号应该与我的Boost库文件中的符号相同。我来完成两个链接阶段,没有?我可以在没有剩下的情况下链接一个程序的唯一方法是创建一个动态库,不是吗?)

3 个答案:

答案 0 :(得分:1)

给定的可执行文件每个符号只能有一段代码。因此,如果他们的库使用boost v.1中的符号foo并且你使用boost v.2中的相同符号,那么你将得到一个冲突。没有改变符号就没有简单的方法可以摆脱这种冲突。如果你能够将增强代码编译成dynamic library,那么应该可以使用动态执行,但这似乎有点矫枉过正。

因为在C ++中,符号被其类/命名空间破坏,你也可以改变其中一个来改变符号。

答案 1 :(得分:0)

如果您只使用仅限标头的boost库,则可以单独构建与链接其他库的代码分开的代码。

您使用哪种增强库?

答案 2 :(得分:0)

api如何与他们使用的boost库相关联?他们部署了一个提升 - ##。所以用它,或者它是静态链接?

所以,请在api .so中运行“objdump -T api.so | grep boost”来检查api是否暴露了Boost。

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

如果它是静态链接的并且没有公开(或重命名)增强符号,那么你可以在你的代码中使用boost而不用考虑API的提升。

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