C++ 同时使用2个版本的boost

C++ 同时使用2个版本的boost,c++,boost,C++,Boost,我使用的是RHEL 5.3,它与gcc 4.1.2和boost 1.33一起提供。 我想要一些功能,它们在boost 1.33中缺失了。 因此,我们的想法是升级到全新的boost 1.43版 是否可以同时使用boost 1.43中的某些仅页眉库和1.33中的其他库?例如,我想使用无序的_映射,它在boost 1.33中缺失 可以同时使用不同版本的二进制boost库吗 如果运气好一点(并且非常小心),您可能可以使用全新的标题。对于几乎所有其他的事情,它可能会在短时间内变得丑陋,因为Boost的某些

我使用的是RHEL 5.3,它与gcc 4.1.2和boost 1.33一起提供。 我想要一些功能,它们在boost 1.33中缺失了。 因此,我们的想法是升级到全新的boost 1.43版

  • 是否可以同时使用boost 1.43中的某些仅页眉库和1.33中的其他库?例如,我想使用无序的_映射,它在boost 1.33中缺失

  • 可以同时使用不同版本的二进制boost库吗

  • 如果运气好一点(并且非常小心),您可能可以使用全新的标题。对于几乎所有其他的事情,它可能会在短时间内变得丑陋,因为Boost的某些部分引用了其他部分,如果一些v。1.33代码意外加载v。1.43对于它的依赖性,很有可能你会因此遇到一些问题——在这一点上,你最希望的就是快速、彻底地死亡(崩溃),但你可能很容易变得更糟(例如,无声的数据损坏)。

    不——永远不要这样做

    这是不可能的,你很可能会意外撞车

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

    最新版本的BCP提供了此选项。因此,您将使用类似于boost_1_43的内容,而不是boost。但这对你来说是相当透明的。但你还是应该知道 其中,不能在同一个cpp文件中使用两个版本的boost

    还可以看看这个讨论:

    喜欢的脚本重命名名称空间、定义和包含名称空间,因此您可以实际包含两个名称空间 boost-like的版本

    #include <boost/foo.hpp>
    #include <myboost/bar.hpp>
    
    boost::foo f;
    myboost::bar b;
    
    你会期望:

    30 -10
    
    但你会得到

    30 30
    

    取决于链接顺序

    因此,使用两个boost版本时,您可能会意外使用其他boost和crash版本的符号 与此程序中相同,符号
    int add(int,int)
    解析为相同的符号偶数
    如果它被放置在不同的编译单元中。

    更新

    我认为我最初的答案对链接器的功能和使用的选项做了太多的假设,很可能是完全错误的。通常我会删除它,但在讨论中有一些要点没有包含在其他答案中

    我发现构建一个行为良好的封闭源代码库所需要的含义令人惊讶

    原始答案

    只要您在每个编译步骤中使用一个版本,就应该可以了,因为代码是在编译时生成的,生成的符号应该限制在编译步骤的范围内

    我假设Boost仍然是一个没有可链接库的模板库。如果不是,那么只要不链接多个版本的库,就仍然可以

    在这一点上我可能是错的,但这意味着您不能使用任何针对不同版本的Boost构建的第三方库,而不是为您的应用程序定义的版本。我所读到或听到的任何东西都没有暗示这一限制适用

    如果您正在构建自己的应用程序,那么我将为您自己的所有代码使用一个版本的Boost。它不必与RHEL提供的版本相同


    更新

    与Artyom的例子相比,我谈论的场景更像这样:

    g++ -c -I/usr/include/boost_1.31 a.cpp
    g++ -c -I/usr/include/boost_1.39 b.cpp
    ar rcs liba.a a.o
    ar rcs libb.a b.o
    g++ -I/usr/include/boost_1.41 test.cpp liba.a libb.a -o test
    

    。。。现在我理解了Artyom的观点,因为这取决于链接器是否喜欢同一个库文件中的符号。

    +1用于链接-尽管我不同意你回答的前半部分。@richj-在所有链接都是显式的DLL平台下是可能的,但对于ELF来说,坏事情会发生(根据经验)你所说的精灵是指:?如果是这样,我对它一无所知,但我不知道它与C++元编程的关系。请解释。@richj请看我答案中的例子。谢谢你的例子。我更新了我的帖子,以便更好地解释我所说的情景。当我指的是“一起编译的一组文件”时,我不应该使用“编译单元”。我将其改为“编译步骤”。@Artyom这是否意味着必须在ELF平台上从源代码构建所有内容,才能构建依赖于Boost库的应用程序?或者你能用增量链接或共享库解决多个Boost版本的问题吗?顺便说一句,这不仅仅是ELF,Windows上的静态链接也有相同的功能。即使是共享库(ELF)在运行时也会遇到同样的问题。对于dll,如果在dll的API中没有公开,则可以使用两个不同版本的boost拥有两个不同的dll。所以不要这样做。。。曾经
    g++ a.cpp b.cpp test.cpp
    
    30 -10
    
    30 30
    
    -10 -10
    
    g++ -c -I/usr/include/boost_1.31 a.cpp
    g++ -c -I/usr/include/boost_1.39 b.cpp
    ar rcs liba.a a.o
    ar rcs libb.a b.o
    g++ -I/usr/include/boost_1.41 test.cpp liba.a libb.a -o test