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