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

时间:2008-09-23 18:22:39

标签: c++ boost namespaces

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

4 个答案:

答案 0 :(得分:10)

我通过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_XYZ宏及其用途替换为BOOST_1_36_0_XYZ宏。
    • 如果您愿意付出努力,这可能会奏效。

答案 1 :(得分:4)

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

这样的东西
bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install

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

答案 2 :(得分:1)

@Josh: 虽然我同意颤抖,但我仍然相信这是更好的行动方案。否则,连接麻烦是肯定的。我曾经遇到过这种情况,我不得不使用objcopy破解已编译的库以避免定义冲突。这是平台互操作性原因的噩梦,因为即使在相同编译器的不同版本(在我的情况下,GCC)中,名称修改的工作方式也大不相同。

答案 3 :(得分:0)

你会有一个连接困难的世界,因为受损的名字会有所不同。是的,我看到你知道这一点,但似乎它会在周围出现问题。