我希望同时将两个版本的 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);
我希望同时将两个版本的 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);
我通过开发列表讨论阅读(仔细阅读) 。没有简单的解决方案。总结一下:
在命名空间声明中包装头文件
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
。
使用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
,但自己检查链接中的文档,因为我不确定它是否是合法的语法。
@Josh:虽然我同意颤抖,但我仍然相信这是更好的做法。否则,链接问题是肯定的。我曾经遇到过这样的情况,我不得不使用它来破解编译的库objcopy
以避免定义冲突。由于平台互操作性的原因,这是一场噩梦,因为即使在相同编译器的不同版本(在我的例子中,GCC)中,名称修饰的工作方式也非常不同。
您将在链接方面遇到麻烦,因为损坏的名称会有所不同。是的,我知道你知道这一点,但它似乎到处都是麻烦。