2010-04-26 10 views
5

Quiero construir mi programa con el compilador LSB C++ desde la base de Linux estándar http://www.linuxfoundation.org/collaborate/workgroups/lsb. El programa depende de la biblioteca de Boost, construida con la versión de gcc 4.4. La compilación falla ¿Es posible construir la biblioteca de Boost con el compilador LSB C++? Alternativamente, ¿es posible construir la biblioteca de Boost con alguna versión antigua de gcc, qué versión se recomienda? Mi objetivo final es lograr que mis ejecutables y las bibliotecas de terceros Boost se ejecuten en la mayoría de las distribuciones de Linux.Building Boost con el compilador LSB C++

En general, ¿qué se puede hacer para obtener una mejor compatibilidad binaria para las distribuciones de Linux, desarrollando una aplicación de código cerrado de C++ dependiendo de la biblioteca de Boost?

+0

¿Desde cuándo es LSB un compilador? Pensé que era solo una especificación de qué bibliotecas y utilidades deberían instalarse y estar disponibles en una distribución de Linux (para que otras bibliotecas y utilidades puedan depender de que estén allí). –

+0

Michael Aaron Safyan: el proyecto LSB proporciona su propio compilador C++ que se puede usar en lugar de GCC, y se supone que produce binarios compatibles con todas las distribuciones de Linux. De hecho, el uso de este compilador para mi propio código da buenos resultados. Sin embargo, tengo problemas con las bibliotecas de terceros utilizadas en mi proyecto. –

+0

@Michael, LSB es un conjunto de especificaciones, pero el grupo de trabajo también proporciona herramientas que ayudan a desarrollar programas que coincidan con estas especificaciones. Vea aquí http://ldn.linuxfoundation.org/lsb/porting-lsb-demo y aquí http://www.linuxfoundation.org/collaborate/workgroups/linux-standard-base-lsb/lsb-sdk-403 –

Respuesta

3

LSB El compilador de C++ no es realmente un compilador. El ejecutable lsbc++ es un envoltorio alrededor del compilador GCC que está instalado en su sistema (el compilador real se puede controlar a través de la opción --lsb-cxx). Lo más probable es que hackes en el sistema de compilación de refuerzo para que llame al contenedor LSB en lugar del compilador nativo gcc.

Por lo tanto, es muy probable que los problemas que surjan no sean que el compilador LSB no pueda compilar las construcciones del lenguaje, sino que existen algunos problemas de vinculación.

Por ejemplo, el compilador LSB descarta por defecto cualquier biblioteca compartida con la que esté vinculado el código, a menos que pertenezcan a LSB. Esto puede conducir a errores de enlace si BOOST se basa en tales bibliotecas. Esto se puede controlar a través de la variable de entorno LSBCC_SHAREDLIBS, pero debe asegurarse de enviar estas libs junto con su producto.

Otro problema es que LSB se queda atrás de las versiones del compilador de GCC (y BOOST puede arrastrarse a todos los rincones oscuros de los compiladores). Por lo que sé, GCC 4.4 no se ha probado lo suficiente, por lo que será mejor que lo pruebes con el compilador 4.3.

Y Google no parece encontrar nada relacionado con la creación de impulso con LSBCC, por lo que si logra hacerlo, por favor, comparta su experiencia, por ejemplo, como su propia respuesta a su pregunta.

+0

Intenté construir el Boost reemplazando el archivo g ++ con un enlace a lsbC++. El resultado fue que la compilación de muchas bibliotecas falló. Voy a probar la versión GCC 4.3, gracias por esta información. –

+0

@Alex, espero que junto con el reemplazo del enlace también apunte 'lsbC++' al compilador real, por lo que no se repitió :-D. De todos modos, también puede tratar de obtener ayuda en la lista de correo de LSB: https://lists.linux-foundation.org/mailman/listinfo/lsb-discuss El formato de la lista de correo es más adecuado para discutir los errores concretos con los registros de errores que StackOverflow . –

+0

El uso de GCC 4.3 no ayudó, aún no puedo usar el compilador lsbC++ para bibliotecas de terceros. Sin embargo, tengo algunos resultados con LSB Application Checker. Al agregar bibliotecas que faltan a mi paquete, logré obtener 49 de 50 compatibilidad de distribuciones de Linux para el programa usando la biblioteca Boost ASIO. Tipo de éxito ... Gracias por su ayuda. –

6

que he tenido recientemente llamar a ello, en el caso de que sea de utilidad para cualquier otra persona que estos son los pasos que hemos seguido:

  • descargar e instalar el LSB SDK
  • Descargar una versión de impulsar y extraer a/opt/boost/boost_ < versión > (utilicé 1.43)
  • Asegúrese de que libbz2-dev esté instalado.
  • Bootstrap con
cd /opt/boost/boost_<version> 
./bootstrap.sh --prefix=/opt/boost --without-libraries=python,mpi --without-icu 
  • Edición /opt/boost/boost_<version>/project-config.jam y agregue la línea
using gcc : : /opt/lsb/bin/lsbc++ : <cflags>-U_GNU_SOURCE <cxxflags>-U_GNU_SOURCE ; 

cerca de la parte superior del archivo. Tenga en cuenta que esto fallará si tiene una declaración using en uno de los otros archivos desde los cuales lee su configuración, puede pasar --debug-configuration para tener una idea de qué archivos está leyendo.

  • Run
./bjam cflags=-fPIC cxxflags=-fPIC linkflags=-fPIC install 

Yo no trato de obtener ya sea la pitón o librerías MPI de trabajo, ni tampoco trato de que la UCI se trabaja con la biblioteca boost.regex. El último es probablemente el caso de crear versiones estáticas de las bibliotecas de la ICU con el conjunto de herramientas LSB.

El -fPIC no es estrictamente necesario para Linux de 32 bits, pero es necesario si desea vincular bibliotecas estáticas en una biblioteca compartida para Linux de 64 bits.

El resultado final debe ser binarios en /opt/boost/lib y encabezados en /opt/boost/include, obviamente, puede modificar el prefijo para adaptarlo a sus preferencias. Todavía tengo que hacer una gran cantidad de trabajo antes de transferir todo nuestro código al LSB, por lo que no puedo informar qué tan bien está el proceso de certificación.

+0

Interesante, gracias. Actualmente estoy usando herramientas automáticas para resolver el problema de compatibilidad binaria. Mantendré tu respuesta para referencia futura. –

Cuestiones relacionadas