principales librerias lenguaje funciones estandar ejemplos clases bibliotecas biblioteca c++ gcc boost compiler-errors

c++ - lenguaje - librerias y bibliotecas de c



Usar la biblioteca de impulso con una versión de compilador diferente (2)

Boost está plagado de bloques de compilación condicionales basados ​​en la disponibilidad o el soporte de diferentes características por parte del compilador. Mira su macro lista . Diferentes compiladores (o versiones) tienen diferentes niveles de soporte para diferentes características estándar (o extensiones). Las bibliotecas de Boost son una combinación de código que se adapta al mínimo común denominador (cuando no "daña" el código), soluciones temporales específicas del compilador y uso condicional de características que, cuando se admiten, pueden proporcionar un claro beneficio.

Estoy muy inclinado a creer que esto es lo que está causando el problema. Cuando compiló por primera vez para codificar un compilador y una plataforma en particular, se activaron ciertos conmutadores y otros se desactivaron según la plataforma admitida, lo que condujo a una biblioteca binaria que solo funciona realmente para esa plataforma. Luego, cuando trataste de compilar tu código en otra plataforma, se activaron / desactivaron diferentes conmutadores dentro de los encabezados de impulso, lo que provocó incompatibilidades en el tiempo de enlace.

Para resumir, no puedes hacer lo que estás tratando de hacer, al menos, no sin bastante trabajo. Una solución sería averiguar qué macros de impulso (de la lista a la que he vinculado) se activan o desactivan en la plataforma menos capaz, y luego, defina manualmente esas macros en su código para imponer una compilación idéntica en todas las plataformas. Pero esto podría requerir mucha mano de obra.

Boost tiene una distribución muy buena y amplia (también de binarios). Por lo tanto, no me preocuparía demasiado poder instalar los binarios de refuerzo en diferentes plataformas.

Compilé boost 1.54 con gcc versión 4.6.3 (en 3.2.0-29-generic # 46-Ubuntu). Luego, desarrollé mi biblioteca usando esta biblioteca de impulso. Como no quiero recompilar el impulso cada vez que cambio mi biblioteca, agregué compiladas bibliotecas estáticas de impulso a mi git repo.

Ahora, estoy tratando de compilar mi biblioteca en una máquina diferente con compilador de versiones diferentes (probado con gcc 4.4 y gcc 4.7). Mi biblioteca compila bien, pero cuando se trata de vincular es imprimir los siguientes errores.

`.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

PD: Traté de compilar con una máquina diferente con la misma versión del compilador también. (gcc versión 4.6.3 y Centos 6.4)


El c ++ ABI no está garantizado para ser coherente en las diferentes versiones del compilador. Esto afecta el cambio de nombre de c ++ y podría causar los errores del enlazador que está viendo. Tienes que usar la misma versión de gcc para todas las libs.

Lo mejor sería mantener todo tu sistema en la última versión compatible de gcc. Si sus usuarios realmente requieren compiladores diferentes, entonces puede suministrar diferentes versiones de su biblioteca, una para cada compilador que desee.

La vinculación con bibliotecas compiladas con diferentes compiladores no está garantizada para funcionar. Esto es cierto tanto para libretas de códigos c ++ estáticas como compartidas / dinámicas.

También eche un vistazo a: Eche un vistazo al error del vinculador de C ++ inusual: ''Definido en la sección descartada'' Parece que la respuesta aceptada a esa pregunta también fue compilar todas las bibliotecas con la misma versión de GCC.