2012-02-17 23 views
8

Estamos construyendo un programa bajo Linux que funciona dentro de una versión específica de Ubuntu sin problemas. Pero nos gustaría tener el mismo binario ejecutándose en Ubuntu 10.04 y 11.10. Sería completamente correcto construir la aplicación en la plataforma 10.04. Pero cuando hago esto, tengo dependencias con versiones específicas de la biblioteca (por ejemplo, libboost_thread.so.1.40.0) que no están disponibles en 11.10 porque usa versiones más nuevas. El sistema se construye usando QMake.Compilar C++ para varias versiones de Ubuntu

Estoy buscando un tutorial o punto de partida sobre cómo resolver estos conflictos de dependencia para múltiples plataformas Ubuntu.

+1

Buena pregunta, usted puede enlazar o enviar estáticamente las bibliotecas con la aplicación y tener un iniciador/envoltorio que modifique LD_LIBRARY_PATH. Pero espero que alguien escriba una mejor respuesta. –

+0

¿Es posible vincular, por ejemplo, libboost_thread.so.1, siempre que todos los 1.x.x sean compatibles con binarios? No estoy seguro acerca de esta biblioteca en particular, pero algunos están versionados de esta manera. – rasmus

+0

@rasmus, googleando Encontré listas de correo de 2009 diciendo que 'no hay ninguna garantía de compatibilidad binaria, me temo'. Aparentemente puede haber compatibilidad binaria casual pero no está garantizada y las aplicaciones deben vincular con la versión exacta. –

Respuesta

3

Si nadie más tiene ganas de darle un golpe a esto, también puedo inyectar algo.

Voy a hacer algunas suposiciones.

  • Usted está distribuyendo una aplicación de origen binario/cerrado
  • quiere distribuir por sí mismo

lo que excluye toda "acaba de dejar la distro/usuarios construir para su instalación a sí mismos".

Mirando cómo otros han resuelto problemas similares Puedo ver que es común incluir las bibliotecas compartidas con su aplicación y luego usar un cargador/envoltorio, como usted lo quiere llamar, script que modifica el entorno antes de iniciar el solicitud. Específicamente, modifican LD_LIBRARY_PATH para incluir la carpeta/lib incluida con la aplicación.

El script podría ser tan simple como.

#!/bin/sh 

LD_LIBRARY_PATH=./lib ./myAppReal 

Así es como he resuelto distribuir una aplicación de Qt4 a los usuarios que tienen distribuciones que no envía más nuevo que Qt-3.3.6 (en 2009 ... en serio). Edit: También podría decir por usuarios me refiero a la gente de 5-ish en la empresa que paga por desarrollo, fallo de especificación de nuestra parte sin pedirles que sean más específicos cuando dijeron multiplataforma en sistemas operativos modernos.

Ahora alguien probablemente encontrará una docena de cosas mal con esto, pero eso es bueno, puedo actualizar y aprender sobre la marcha.

EDIT: Como JimR dijo que esto conlleva implicaciones de seguridad, si deja la carpeta libs en el mundo escribible alguien puede usarla para inyectar código malicioso en su aplicación. Dependiendo de cómo planeas desplegarlo, puede o no ser un problema real, pero debes ser consciente de ello.

+0

¿Qué tan grande era tu carpeta lib? – rasmus

+0

Si usa este método, asegúrese de considerar cuidadosamente los permisos en los directorios de la biblioteca que agrega a LD_LIBRARY_PATH. Te estás creando problemas de seguridad si se pueden inyectar bibliotecas en tu código. – JimR

+0

@rasmus, en realidad no recuerdo, ¿qué es QtGui? 11MB? –

Cuestiones relacionadas