我用gcc版本4.6.3编译了boost 1.54(在3.2.0-29-generic #46-Ubuntu中),然后我用这个boost库开发了我的库,因为我不想每次修改我的库时都重新编译boost,所以我在git repo中添加了boost的静态库。
现在,我尝试在不同的机器上用不同版本的编译器编译我的库(尝试用gcc 4.4和gcc 4.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
附言:我试着用不同的机器编译相同的编译器版本(gcc版本4.6.3和Centos 6.4)
2条答案
按热度按时间ebdffaop1#
不保证C++ ABI在不同的编译器版本之间保持一致。这会影响C名称的修改,并可能导致您看到的链接器错误。您必须对所有库使用相同版本的GCC。
最好的方法是让整个系统都使用最新支持的GCC版本。如果用户确实需要不同的编译器,您可以提供不同版本的库--为您想要支持的每个编译器提供一个版本。
链接用不同编译器编译的库并不一定有效。静态和共享/动态C库都是如此。
还看一看:Unusual C++ linker error - 'Defined in discarded section'
似乎这个问题的公认答案也是用相同版本的GCC编译所有库。
jobtbby32#
基于编译器对不同特性的可用性或支持,Boost充满了条件编译块。请参见它们的macro list。(或版本)对不同的标准功能具有不同的支持级别Boost库是一组代码的混合体,它们按照最小公分母进行定制(在不“伤害”代码的情况下)、特定于编译器的解决方法以及有条件地使用特性(如果支持这些特性,则可以提供明显的好处)。
我非常倾向于相信这是导致问题的原因。当你第一次编译为特定编译器和平台的代码时,某些开关被打开,另一些开关被关闭,这取决于那个平台支持什么,这导致了一个只真正适用于那个平台的二进制库。然后,当你试图在另一个平台上编译你的代码时,在升压头内打开/关闭不同的开关,导致链接时的不兼容性。
长话短说,你不能做你想做的事情,至少,没有相当多的工作。一个解决方案是找出哪些boost宏(从我链接到的列表中)在能力最差的平台上打开或关闭,然后,在你的代码中手动定义这些宏,以在所有平台上强制执行相同的编译。但这可能是劳动密集型的。
Boost有很好的广泛的发行版(二进制文件也是),所以,我不会太担心能够在不同的平台上安装Boost二进制文件。