我看到有两个版本的增编入一个项目在同一时间。理想的是,他们应可使用的沿着这些线:

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);
有帮助吗?

解决方案

我读(以及扫描)通过 发展的讨论列表.没有简单的解决方案。综上:

  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. 修改整个提高图书馆替换 namespace boost {..}namespace boost_1_36_0 {...} 然后提供一个名字空间的别名。代替所有 BOOST_XYZ 宏及其用途 BOOST_1_36_0_XYZ 宏。
    • 这将有可能的工作如果你愿意投入的努力。

其他提示

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

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

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

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

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top