同时使用2个版本的boost

dim*_*mba 12 c++ boost

我正在使用RHEL 5.3,它随gcc 4.1.2和1.33一起提供.我想要的一些功能,在增强1.33中缺失.因此,我们的想法是升级到1.43的新增助推出.

  1. 是否可以同时使用来自boost 1.43的其他一些仅限标题的库,其余来自1.33?例如,我想使用unorded_map,它在boost 1.33中缺失.

  2. 是否可以使用来自不同版本的并发二进制boost库?

Art*_*yom 14

不 - 永远不要这样做!

这是不可能的,你可能会意外崩溃.

正确完成它的唯一方法是使用命名空间重命名:即创建放置在不同命名空间中的替代boost版本.

最新版本的BCP提供此选项.因此,您将使用boost_1_43而不是boost.但对你来说这将是非常透明的.但是你仍然应该意识到你不能在同一个cpp文件中使用两个版本的boost.

另请参阅此讨论:使用向后兼容的使用Boost的ABI创建库

喜欢的脚本重命名命名空间,定义和包含,所以你可以实际包含两个版本的boost

#include <boost/foo.hpp>
#include <myboost/bar.hpp>

boost::foo f;
myboost::bar b;
Run Code Online (Sandbox Code Playgroud)

Boost BCP不允许这样做.

但是仍然你应该小心,因为一些库导出extern"C"符号没有boost前缀,boost :: thread和boost :: regex的C API(regexec,regcomp)

编辑

作为此类问题的示例,请创建以下文件:

a.cpp:

template<typename Foo>
Foo add(Foo a, Foo b)
{
        return a+b;
}


int foo(int x,int y)
{
        return add(x,y);
}
Run Code Online (Sandbox Code Playgroud)

b.cpp:

template<typename Foo>
Foo add(Foo a, Foo b)
{
        return a-b;
}


int bar(int x,int y)
{
        return add(x,y);
}
Run Code Online (Sandbox Code Playgroud)

TEST.CPP:

#include <iostream>

int foo(int,int);
int bar(int,int);

int main()
{
        std::cout<< foo(10,20) <<" " <<bar(10,20) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

编译它们:

g++ a.cpp b.cpp test.cpp
Run Code Online (Sandbox Code Playgroud)

你会期望:

30 -10
Run Code Online (Sandbox Code Playgroud)

但是你会得到的

30 30
Run Code Online (Sandbox Code Playgroud)

要么

-10 -10
Run Code Online (Sandbox Code Playgroud)

取决于链接顺序.

因此,使用两个boost版本时,您可能会意外地使用来自其他boost和crash的符号,就像在此程序符号int add<int>(int,int)中一样,即使它被放置在不同的编译单元中也会被解析为相同的符号.


Jer*_*fin 3

如果运气好(并且非常小心),您可能可以使用全新的标头。对于几乎所有其他东西,它可能会很快变得丑陋,因为 Boost 的某些部分引用其他部分,并且如果某些 v.1.33 代码意外加载 v.1.43 标头作为其依赖项,那么您很有可能会去结果会出现一些问题——您所能期望的最好的结果就是在那时快速、干净地死亡(崩溃),但您可能很容易变得更糟(例如,静默数据损坏)。