C++ 使用具有不同编译器版本的boost库

C++ 使用具有不同编译器版本的boost库,c++,gcc,boost,compiler-errors,C++,Gcc,Boost,Compiler Errors,我用gcc版本4.6.3(在3.2.0-29-generic#46 Ubuntu中)编译了Boost1.54。 然后,我使用这个boost库开发了我的库。因为我不想每次更改库时都重新编译boost,所以我将编译后的boost静态库添加到git repo中 现在,我尝试在不同的机器上使用不同版本的编译器编译我的库(使用GCC4.4和GCC4.7进行了尝试)。我的库编译得很好,但当涉及到链接时,它会打印以下错误 `.text._ZN5boost16exception_detail10bad_allo

我用gcc版本4.6.3(在3.2.0-29-generic#46 Ubuntu中)编译了Boost1.54。 然后,我使用这个boost库开发了我的库。因为我不想每次更改库时都重新编译boost,所以我将编译后的boost静态库添加到git repo中

现在,我尝试在不同的机器上使用不同版本的编译器编译我的库(使用GCC4.4和GCC4.7进行了尝试)。我的库编译得很好,但当涉及到链接时,它会打印以下错误

`.text._ZN5boost16exception_detail10bad_alloc_D2Ev' referenced in section `.text._ZN5boost16exception_detail10bad_alloc_D1Ev[boost::exception_detail::bad_alloc_::~bad_alloc_()]' of ../external/lib/linux/64/libboost_thread.a(thread.o): defined in discarded section `.text._ZN5boost16exception_detail10bad_alloc_D2Ev[_ZN5boost16exception_detail10bad_alloc_D5Ev]' of ../external/lib/linux/64/libboost_thread.a(thread.o)
`.text._ZN5boost16exception_detail14bad_exception_D2Ev' referenced in section `.text._ZN5boost16exception_detail14bad_exception_D1Ev[boost::exception_detail::bad_exception_::~bad_exception_()]' of ../external/lib/linux/64/libboost_thread.a(thread.o): defined in discarded section `.text._ZN5boost16exception_detail14bad_exception_D2Ev[_ZN5boost16exception_detail14bad_exception_D5Ev]' of ../external/lib/linux/64/libboost_thread.a(thread.o)
`.text._ZN5boost16exception_detail19error_info_injectorINS_21thread_resource_errorEED2Ev' referenced in section `.text._ZN5boost16exception_detail19error_info_injectorINS_21thread_resource_errorEED1Ev[boost::exception_detail::error_info_injector<boost::thread_resource_error>::~error_info_injector()]' of ../external/lib/linux/64/libboost_thread.a(thread.o): defined in discarded section `.text._ZN5boost16exception_detail19error_info_injectorINS_21thread_resource_errorEED2Ev[_ZN5boost16exception_detail19error_info_injectorINS_21thread_resource_errorEED5Ev]' of ../external/lib/linux/64/libboost_thread.a(thread.o)
`.text._ZN5boost16exception_detail19error_info_injectorINS_10lock_errorEED2Ev' referenced in section `.text._ZN5boost16exception_detail19error_info_injectorINS_10lock_errorEED1Ev[boost::exception_detail::error_info_injector<boost::lock_error>::~error_info_injector()]' of ../external/lib/linux/64/libboost_thread.a(thread.o): defined in discarded section `.text._ZN5boost16exception_detail19error_info_injectorINS_10lock_errorEED2Ev[_ZN5boost16exception_detail19error_info_injectorINS_10lock_errorEED5Ev]' of ../external/lib/linux/64/libboost_thread.a(thread.o)
`.text._ZN5boost16exception_detail19error_info_injectorINS_15condition_errorEED2Ev' referenced in section `.text._ZN5boost16exception_detail19error_info_injectorINS_15condition_errorEED1Ev[boost::exception_detail::error_info_injector<boost::condition_error>::~error_info_injector()]' of ../external/lib/linux/64/libboost_thread.a(thread.o): defined in discarded section `.text._ZN5boost16exception_detail19error_info_injectorINS_15condition_errorEED2Ev[_ZN5boost16exception_detail19error_info_injectorINS_15condition_errorEED5Ev]' of ../external/lib/linux/64/libboost_thread.a(thread.o)
collect2: ld returned 1 exit status
make[2]: *** [libHazelcastClientShared_64.so] Error 1
make[1]: *** [CMakeFiles/HazelcastClientShared_64.dir/all] Error 2
make: *** [all] Error 2
`.text.`.text.`.ZN5boost16exception\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\../external/lib/linux/64/libboost\u thread.a(thread.o)的[zn5boost16异常\u detail10bad\u alloc\u D5Ev]'
`.text.“.text”节中引用了“.text”节中的“.ZN5boost16exception”\u detail14bad\u exception\u D2Ev”./external/lib/linux/64/libboost\u thread.a(thread.o)的“.text”节中定义的“../external/lib/linux/64/libboost\u thread.a(thread.o)的
`.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 21thread\u resource\u errorEED2Ev'引用于“.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 21thread\u resource\u errorEED1Ev”../external/lib/linux/64/libboost\u thread.a(thread.o)的:在../external/lib/linux/64/libboost\u thread.a(thread.o)的丢弃部分“.text.\ZN5boost16exception.\u detail19error\u info\u injectorINS\u errorEED5Ev”中定义
`.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 10lock\u errorEED2Ev'引用于节“.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 10lock\u errorEED1Ev”../external/lib/linux/64/libboost\u thread.a(thread.o)的:在../external/lib/linux/64/libboost\u thread.a(thread.o)的丢弃部分“.text.\ZN5boost16exception\u detail19 error\u info\u injectorINS\u 10lock\u errorEED2Ev[\u ZN5boost16exception\u detail19 error\u injectoriented5ev]”中定义
`.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 15condition\u errorEED2Ev'引用于“.text.\u ZN5boost16exception\u detail19error\u injectorINS\u 15condition\u error\u detail::error\u injector:~error\u info\u injector()”的../external/lib/linux/64/libboost\u thread.a(thread.o):在../external/lib/linux/64/libboost\u thread.a(thread.o)的丢弃部分“.text.\u zn5boost16异常\u细节19error\u injectorINS\u injectorINS\u 15condition\u errorEED5Ev]”中定义
collect2:ld返回了1个退出状态
make[2]:***[libHazelcastClientShared_64.so]错误1
生成[1]:***[CMakeFiles/HazelcastClientShared_64.dir/all]错误2
make:**[全部]错误2

PS:我试着用一台不同的机器编译同样的编译器版本。(gcc版本4.6.3和Centos版本6.4)

< p>在不同编译器版本中,C++ abi不一致。这会影响C++名称的篡改,并可能导致链接错误。您必须使用相同版本的GCC来处理所有LIBS。

最好是让整个系统保持在最新支持的gcc版本上。如果您的用户确实需要不同的编译器,那么您可以提供不同版本的库-每个编译器一个

<> >与不同编译器编译的库链接不是工作的。对于静态和共享/动态C++ LIBS,这是正确的。

另外,请看: 看看
对这个问题的公认答案似乎也是使用相同版本的GCC编译所有库。

Boost基于编译器对不同功能的可用性或支持,充满了条件编译块。请参阅它们的不同编译器(或版本)对不同的标准功能(或扩展)有不同级别的支持。Boost库是一个混合代码,可裁剪为最小公分母(在不“损害”代码的情况下)、编译器特定的解决方法,以及在支持时可提供明显好处的功能的有条件使用

我倾向于认为这就是问题的原因。当您第一次编译为特定编译器和平台编写代码时,某些开关被打开,其他开关被关闭,这取决于该平台支持的内容,从而导致一个二进制库只在该平台上真正起作用。然后,当您尝试编译代码在另一个平台上,boost报头中的不同开关被打开/关闭,导致链接时不兼容

长话短说,你不能做你想做的事情,至少,如果没有大量的工作,你是做不到的。一个解决方案是找出什么是boost宏(从我链接的列表中)在功能最低的平台上打开或关闭,然后在代码中手动定义这些宏,以便在所有平台上强制执行相同的编译。但这可能需要大量人力


Boost具有非常好的广泛分布(也包括二进制文件)。因此,我不会太担心能够在不同的平台上安装boost二进制文件。

然后我有另一个问题。忘记boost。假设我用gcc 4.7编译了我的库。然后我将它作为静态库分发。那么我的库的用户必须用gcc 4.7编译他/她自己的库吗?如果有人需要两个d,会发生什么不同图书馆