如何将BOOST包装在单独的命名空间中?

时间:2020-03-06 14:37:01  来源:igfitidea点击:

我希望将两个版本的BOOST同时编译到一个项目中。理想情况下,它们应可按以下方式使用:

boost_1_36_0::boost::shared_ptr<SomeClass> someClass = new SomeClass();
boost_1_35_0::boost::regex expression("[0-9]", boost_1_35_0::boost::regex_constants::basic);

解决方案

我们将在连接时遇到麻烦,因为名称混乱将有所不同。是的,我知道我们知道这一点,但是似乎到处都是麻烦。

@Josh:
尽管我同意这一颤抖,但我仍然相信这是更好的做法。否则,可以确定是否存在链接问题。我遇到过这样的情况,在此之前,我不得不使用objcopy来破解已编译的库,以避免定义冲突。由于平台互操作性的原因,这是一场噩梦,因为即使在相同版本的编译器(在我的情况下为GCC)的不同版本中,名称修改的工作方式也非常不同。

我在开发列表讨论中已阅读(仔细阅读)。没有简单的解决方案。总结一下:

  • 由于宏不尊重名称空间,因此不允许两个版本都包含在同一个翻译单元中。
  • 仍然无法解决单个翻译单元中的宏冲突。
  • 一些内部头文件包含可能会被弄乱,因为这种事情确实发生了。
namespace boost_1_36_0 {
    #include <boost_1_36_0/boost/regex.hpp>
}
namespace boost_1_35_0 {
    #include <boost_1_35_0/boost/shared_ptr.hpp>
}

但是解决这些情况可能很容易。

代码数量不匹配

代码数量不匹配