2009-06-01 27 views
16

Estoy desarrollando aplicaciones Qt multiplataforma. Es freeware, aunque no de código abierto. Por lo tanto, quiero distribuirlo como un binario compilado.Cómo hacer la distribución binaria de la aplicación Qt para Linux

En Windows no hay problema, empaqueté mi compilado exe junto con MinGW y Qt's DLL y todo va bien.

Pero en Linux hay un problema porque el usuario puede haber compartido bibliotecas en su sistema muy diferentes a las mías.

La guía de implementación de Qt sugiere dos métodos: vinculación estática y uso de bibliotecas compartidas. El primero produce un ejecutable enorme y también requiere versiones estáticas de muchas bibliotecas de las que Qt depende, es decir, tendré que reconstruir todas ellas desde cero. El segundo método se basa en la reconfiguración del enlazador dinámico justo antes del inicio de la aplicación y me parece un poco complicado.

¿Alguien puede compartir su experiencia en la distribución de aplicaciones Qt bajo Linux? ¿Qué método debo usar? ¿Qué problemas puedo enfrentar? ¿Hay algún otro método para hacer este trabajo?

Respuesta

12

También puede distribuir bibliotecas compartidas de Qt en Linux. Luego, haga que su software cargue esos en lugar de los predeterminados del sistema. Las bibliotecas compartidas pueden ser anuladas usando la variable de entorno LD_LIBRARY_PATH. Esta es probablemente la solución más simple para ti. Siempre puede cambiar esto en un script de contenedor para su ejecutable.

O bien, solo especifique la versión de biblioteca mínima que sus usuarios necesitan tener instalada en el sistema.

3

No es una respuesta como tal (sybreon cubierto eso), pero tenga en cuenta que son no autorizados para distribuir su binario si está estáticamente enlazado con Qt, a menos que haya comprado para uso comercial, de lo contrario sus caídas binarios enteros bajo la GPL (o está en violación de la licencia de Qt.)

Si tiene una licencia comercial, no importa.

Si no tiene una licencia comercial, usted tiene dos opciones:

  1. Enlace dinámicamente contra Qt V4.5.0 o posterior (las versiones LGPL - usted no puede usar las versiones anteriores excepto en abierto fuente de aplicaciones), o

  2. Abra su código fuente.

4

Cuando distribuimos aplicaciones Qt en Linux (o en realidad cualquier aplicación que utilice bibliotecas compartidas) que enviamos un árbol de directorio que contiene el ejecutable real y guión envoltorio asociado en la parte superior con subdirectorios que contienen las bibliotecas compartidas y cualquier otro recurso necesario que no desee vincular.

La ventaja de hacer esto es que puede hacer que el script del contenedor configure todo lo que necesita para ejecutar la aplicación sin tener que preocuparse de que el usuario establezca variables de entorno , instálelo en una ubicación específica, etc. Si lo hace correctamente, esto también le permite no tener que preocuparse de dónde está llamando a la aplicación porque siempre puede d los recursos.

De hecho, llevamos esta estructura de árbol colocando todas las bibliotecas ejecutables y compartidas en los subdirectorios de plataforma/arquitectura para que el script contendor pueda determinar la arquitectura local y llamar al ejecutable apropiado para esa plataforma y establecer las variables de entorno para encontrar las bibliotecas compartidas apropiadas. Descubrimos que esta configuración es especialmente útil cuando se distribuyen múltiples versiones de Linux diferentes que comparten un sistema de archivos común.

Dicho todo esto, aún preferimos construir estáticamente cuando sea posible, las aplicaciones Qt no son una excepción. Definitivamente puede construir con Qt estáticamente y no debería tener que construir muchas dependencias adicionales como Krbyrd notó en su respuesta.

3

sybreon's answer es exactamente lo que he hecho. Siempre puede agregar sus bibliotecas al LD_LIBRARY_PATH o puede hacer algo un poco más elegante:

Configure sus bibliotecas Qt suministradas una por directorio. Escriba un script de shell, haga que se ejecute ldd en el ejecutable y grep para 'no encontrado', para cada una de esas bibliotecas, agregue el directorio apropiado a una lista (llamémoslo $ LDD). Una vez que los tenga todos, ejecute el archivo binario con LD_LIBRARY_PATH establecido en su valor anterior más $ LDD.

Finalmente un comentario sobre "Tendré que reconstruir todos ellos desde cero". No, no tendrás que hacerlo. Si tiene los paquetes dev para esas bibliotecas, debe tener los archivos .a, puede enlazar estáticamente con estos.

15

Las bibliotecas compartidas son el camino a seguir, pero puede evitar el uso de LD_LIBRARY_PATH (que implica ejecutar la aplicación usando un script de shell de iniciador, etc.) construyendo su binario con el indicador del compilador -rpath, señalando que allí almacena sus bibliotecas.

Por ejemplo, almaceno mis bibliotecas al lado de mi binario o en un directorio llamado "mylib" al lado de mi binario. Para utilizar esto en mi archivo QMake, agrego esta línea en el archivo .pro:

QMAKE_LFLAGS += -Wl,-rpath,\\$\$ORIGIN/lib/:\\$\$ORIGIN/../mylib/ 

Y puedo ejecutar mis binarios con mis bibliotecas locales anula cualquier biblioteca del sistema, y ​​sin necesidad de un script lanzador.

0

Puede buscar en la carpeta QtCreator y usarla como ejemplo. Tiene qt.conf y qtcreator.sh archivos en QtCreator/bin.

lib/qtcreator es la carpeta con todas las bibliotecas Qt * .so necesarias. La ruta relativa se establece dentro de qtcreator.sh, que debe pasar a denominarse a you-app-name.sh

importaciones, plugins, QML se encuentran dentro bin directorio. La ruta de acceso se establece en el archivo qt.conf. Esto es necesario para el despliegue de aplicaciones QML.

1

Probablemente la forma más fácil de crear un paquete de aplicación Qt en Linux sea linuxdeployqt. Recopila todos los archivos necesarios y le permite crear un AppImage que se ejecuta en la mayoría de las distribuciones de Linux.

Asegúrese de compilar la aplicación en la versión más antigua de Ubuntu LTS todavía compatible para que su AppImage se pueda enumerar en AppImageHub.

Cuestiones relacionadas