9

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

4 回答 4

10

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

  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
    • 如果您愿意付出努力,这可能会奏效。
于 2008-09-23T19:29:00.673 回答
4

使用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

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

于 2014-01-28T18:01:37.807 回答
1

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

于 2008-09-23T18:29:52.140 回答
0

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

于 2008-09-23T18:25:08.563 回答