题
我看到有两个版本的增编入一个项目在同一时间。理想的是,他们应可使用的沿着这些线:
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_1_36_0',所有'命名空间提升'代码块将以'boost_1_36_0'开头。像
这样的东西bcp --namespace=boost_1_36_0 --namespace-alias shared_ptr regex /path/to/install
,但请自行检查链接中的文档,因为我不确定它是否是合法的语法。
@Josh:
虽然我同意颤抖,但我仍然相信这是更好的行动方案。否则,连接麻烦是肯定的。我曾经遇到过这种情况,我不得不使用 objcopy
来破解已编译的库,以避免定义冲突。这是平台互操作性原因的噩梦,因为即使在相同编译器的不同版本(在我的情况下,GCC)中,名称修改的工作方式也大不相同。
你会有一个连接困难的世界,因为受损的名字会有所不同。是的,我看到你知道这一点,但似乎它会在周围出现问题。
不隶属于 StackOverflow