linux - instalar - librerias qt ubuntu
Cómo hacer una distribución binaria de la aplicación Qt para Linux (7)
Estoy desarrollando aplicación Qt multiplataforma. Es freeware, aunque no de código abierto. Por lo tanto, quiero distribuirlo como un binario compilado.
En Windows no hay problema, empaco mi exe
compilado 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?
Cuando distribuimos aplicaciones Qt en Linux (o en realidad cualquier aplicación que use bibliotecas compartidas), enviamos un árbol de directorios que contiene el script ejecutable y el script envoltorio asociado en la parte superior con subdirectorios que contienen las bibliotecas compartidas y cualquier otro recurso necesario que utilice ''t desea vincular en.
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, instale en una ubicación específica, etc. Si se hace correctamente, esto también le permite no tiene que preocuparse de dónde llama a la aplicación porque siempre puede encontrar los recursos.
En realidad, llevamos esta estructura de árbol aún más colocando todas las bibliotecas ejecutables y compartidas en los subdirectorios de plataforma / arquitectura para que el script de envoltura pueda determinar la arquitectura local y llamar al ejecutable apropiado para esa plataforma y establecer las variables de entorno para encontrar el apropiado bibliotecas compartidas. 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.
Habiendo dicho todo esto, aún preferimos construir estáticamente cuando sea posible, las aplicaciones de 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.
Este artículo tiene información sobre el tema. Lo intentaré yo mismo: http://labs.trolltech.com/blogs/2009/06/02/deploying-a-browser-on-gnulinux/
En pocas palabras:
- Configurar Qt con -platform linux-lsb-g ++
- El enlace debe hacerse con -lsb-use-default-linker
- Empaque todo e impleméntalo (necesitaré algunos ajustes aquí pero aún no lo he intentado, lo siento)
Las librerías 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 -rpath
, etc.) construyendo su binario con el -rpath
compilador de -rpath
, señalando que allí almacena sus bibliotecas.
Por ejemplo, guardo mis bibliotecas al lado de mi binario o en un directorio llamado "mylib" al lado de mi binario. Para usar 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 archivos binarios con mis bibliotecas locales anulando cualquier biblioteca del sistema, y sin necesidad de un script de inicio.
No es una respuesta como tal (sybreon lo cubrió), pero tenga en cuenta que no está autorizado a distribuir su binario si está vinculado estáticamente contra Qt, a menos que haya comprado una licencia comercial, de lo contrario, su binario completo se clasifica como GPL (o está en violación de la licencia de Qt.)
Si tiene una licencia comercial, no importa.
Si no tiene una licencia comercial, tiene dos opciones:
Vincular dinámicamente con Qt v4.5.0 o posterior (las versiones LGPL; no puede usar las versiones anteriores excepto en aplicaciones de código abierto), o
Abra su código fuente.
Puede buscar en la carpeta QtCreator y usarla como ejemplo. Tiene archivos qt.conf y qtcreator.sh 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 ser renombrada como you-app-name.sh
importaciones , complementos , qml están dentro del directorio bin . La ruta a ellos se establece en el archivo qt.conf . Esto es necesario para la implementación de aplicaciones QML .
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 LD_LIBRARY_PATH
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.
De forma alternativa, solo especifique la versión de biblioteca mínima que sus usuarios deben tener instalada en el sistema.
La respuesta de Sybreon es exactamente lo que hice. Siempre puede agregar sus bibliotecas a LD_LIBRARY_PATH o puede hacer algo un poco más elegante:
Configure sus bibliotecas Qt enviadas una por directorio. Escriba un script de shell, haga que 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 binario con LD_LIBRARY_PATH configurado 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 archivos .a
, puede enlazar estáticamente con estos.