【问题标题】:How can I wrap BOOST in a separate namespace?如何将 BOOST 包装在单独的命名空间中?
【发布时间】:2010-09-12 11:23:16
【问题描述】:

我希望同时将两个版本的 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);

【问题讨论】:

  • 我很好奇你为什么要这样做。
  • 这是为了过渡到较新的库版本,同时解决一些不兼容问题。没有什么是永久的。
  • @Eclipse:如果您没有在接口中公开任何 Boost 类型,则可以使用 ELF 可见性属性,隐藏所有不是公共接口的内容。

标签: c++ boost namespaces


【解决方案1】:

我通过development list discussion 阅读(仔细阅读)。没有简单的解决方案。总结一下:

  1. 在命名空间声明中包装头文件

    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>
    }
    
    • 需要修改源文件
    • 不允许两个版本包含在同一个翻译单元中,因为宏不尊重命名空间。
  2. 在包含标题之前定义提升

    #define boost boost_1_36_0
        #include <boost_1_36_0/boost/regex.hpp>
    #undef boost
    #define boost boost_1_35_0
        #include <boost_1_35_0/boost/shared_ptr.hpp>
    #undef boost
    
    • 源文件可以简单地用-Dboost=boost_1_36_0编译
    • 仍然没有解决单个翻译单元中的宏冲突。
    • 某些内部头文件包含可能会搞砸,因为这种事情确实会发生。

      #if defined(SOME_CONDITION)
      #  define HEADER <boost/some/header.hpp>
      #else
      #  define HEADER <boost/some/other/header.hpp>
      #endif
      

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

  3. 修改整个boost库以将namespace boost {..}替换为namespace boost_1_36_0 {...},然后提供命名空间别名。用BOOST_1_36_0_XYZ 宏替换所有BOOST_XYZ 宏及其用途。
    • 如果您愿意付出努力,这可能会奏效。

【讨论】:

  • 如果你要修改标题,你也许可以避免与's/BOOST_/BOOST_1_36_0_/g'之类的宏冲突。也许吧。
【解决方案2】:

使用bcp 可以将boost 库安装到特定位置,并且可以将其代码中的所有“命名空间boost”替换为自定义别名。假设我们的别名是“boost_1_36_0”,所有“命名空间提升”代码块都以“boost_1_36_0”开头。像

bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install

,但是请自己检查链接中的文档,因为我不确定它是否合法。

【讨论】:

    【解决方案3】:

    @乔希: 虽然我同意颤抖,但我仍然相信这是更好的做法。否则,链接问题是肯定的。我曾经遇到过必须使用objcopy 破解编译库以避免定义冲突的情况。由于平台互操作性的原因,这是一场噩梦,因为即使在相同编译器的不同版本(在我的例子中,GCC)中,名称修饰的工作方式也非常不同。

    【讨论】:

      【解决方案4】:

      链接会很麻烦,因为损坏的名称会有所不同。是的,我知道你知道这一点,但它似乎到处都是麻烦。

      【讨论】:

      • 这就是重点。我也会使用命名空间指令将所有正则表达式源文件包装在 boostv1 目录中。
      猜你喜欢
      • 1970-01-01
      • 2019-10-21
      • 2010-10-02
      • 1970-01-01
      • 2021-10-03
      • 1970-01-01
      • 1970-01-01
      • 2013-07-07
      • 2013-10-01
      相关资源
      最近更新 更多