我希望同时将两个版本的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);
答案 0 :(得分:10)
我通过development list discussion阅读(经过良好扫描)。没有简单的解决方案。总结一下:
在名称空间声明中包装头文件
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>
}
在包含标题之前定义提升
#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
但要解决这些问题可能很容易。
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)
你会有一个连接困难的世界,因为受损的名字会有所不同。是的,我看到你知道这一点,但似乎它会在周围出现问题。