我正在使用RHEL 5.3,它随gcc 4.1.2和1.33一起提供.我想要的一些功能,在增强1.33中缺失.因此,我们的想法是升级到1.43的新增助推出.
是否可以同时使用来自boost 1.43的其他一些仅限标题的库,其余来自1.33?例如,我想使用unorded_map,它在boost 1.33中缺失.
是否可以使用来自不同版本的并发二进制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)中一样,即使它被放置在不同的编译单元中也会被解析为相同的符号.
如果运气好(并且非常小心),您可能可以使用全新的标头。对于几乎所有其他东西,它可能会很快变得丑陋,因为 Boost 的某些部分引用其他部分,并且如果某些 v.1.33 代码意外加载 v.1.43 标头作为其依赖项,那么您很有可能会去结果会出现一些问题——您所能期望的最好的结果就是在那时快速、干净地死亡(崩溃),但您可能很容易变得更糟(例如,静默数据损坏)。
| 归档时间: |
|
| 查看次数: |
7692 次 |
| 最近记录: |