Notas de desarrollo del sistema Tongxin UOS (7): Use linuxdeployqt para lanzar programas qt en el sistema Tongxin UOS

Si el artículo es un artículo original, indique la fuente del artículo original al reproducirlo.
La dirección del blog de este artículo: https://hpzwl.blog.csdn.net/article/details/131411975

Enciclopedia del blog de Red Fatty (Red Imitation): la colección de tecnología de desarrollo (incluida la tecnología práctica Qt, Raspberry Pi, 3D, OpenCV, OpenGL, ffmpeg, OSG, microcomputadora de un solo chip, combinación de software y hardware, etc.) actualizado... (haga clic en el portal)

Sistema doméstico Kirin, desarrollo relacionado con el sistema Tongxin UOS

Anterior: " Notas de desarrollo del sistema Union UOS (6): después de extraer el software de instalación en línea, extraiga su paquete de instalación e implemente la máquina de destino para instalar el software usando un paquete de software fuera de línea" Siguiente
: " Notas de desarrollo del sistema Union UOS (8) ): Compile y construya el entorno básico mqtt en Tongxin UOS (la versión usa QMQTT::Clinet)


prefacio

  Es relativamente bueno lanzar el programa qt en ubuntu, usando scripts, pero cuando se lanza en Tongxin UOS Kylin, debido a las diferentes versiones como Galaxy Kylin, el uso de scripts no es compatible y para lograr el efecto de hacer clic directamente la aplicación para iniciar la aplicación, use linuxdeployqt para lanzar programas qt.


Aviso

  En este artículo, la combinación manual de varios métodos finalmente fue exitosa y tomó mucho tiempo de investigación, se infiere que el terminal ingresó directamente una variable de entorno adicional después de ldd, lo que resultó en la falla para conectarse con éxito, es decir, la primera capa tiene éxito, y la primera La variable de entorno de este paso de la que depende la biblioteca de la capa llama a ldd se fortalece.
  Pero al final, la implementación empaquetada se realizó implementando manualmente linuxdeployqt y compilando la configuración.


blog relacionado

  " Habilidades prácticas de Qt: proceso de empaquetado del programa de lanzamiento de ubuntu (resolver el error de carga del complemento xcb) "
  " Acerca del programa QWidget+Qml empaquetado para ubuntu, el programa es diferente de la versión de la biblioteca del sistema y el método para agregar y confiar en el biblioteca incorporada al compilar "
  " Consejos prácticos de Qt: use linuxdeployqt para empaquetar y lanzar programas qt en CentOS "
  " Notas de desarrollo del sistema Kylin (8): use linuxdeployqt para lanzar programas qt en sistemas domésticos Kylin "


Versión del sistema Tongxin UOS

  versión del sistema:
  inserte la descripción de la imagen aquí


linuxdeployqt

La herramienta de implementación de Linux, linuxdeployqt, toma una aplicación como entrada y la convierte en autónoma   copiando los recursos utilizados por la aplicación, como bibliotecas, gráficos y complementos, en un paquete . El paquete resultante puede distribuirse a los usuarios como AppDir o AppImage, o colocarse en un paquete de distribución cruzada. Puede implementar aplicaciones escritas en C, C++ y otros lenguajes compilados en sistemas como CMake, qmake y make como parte del proceso de compilación. Cuando se usa en una aplicación basada en Qt, puede vincular un subconjunto mínimo específico de Qt requerido para ejecutar la aplicación.

Dirección de descarga del código fuente

  Ventiladores csdn Dirección de descarga de 0 puntos: https://download.csdn.net/download/qq21497936/86803960
  Dirección de gitcode: https://gitcode.net/mirrors/probonopd/linuxdeployqt


compilación linuxdeployqt (sistema Union UOS)

Paso 1: Descarga y descomprime

  inserte la descripción de la imagen aquí

Paso 2: Modifique el código fuente y elimine la verificación de versión de gcc

  Encuentre el código fuente de main.cpp y comente este párrafo (sobre la línea 192) (mirando el código fuente aquí, en realidad se puede controlar a través de la configuración (lo encontró investigando el código fuente, pero no actuamos más, solo publícalo):
  inserte la descripción de la imagen aquí

  O continúe modificando el método anterior:

vi linuxdeployqt-master/tools/linuxdeployqt/main.cpp

  inserte la descripción de la imagen aquí

Paso 3: Usa la configuración de cmake

cd linuxdeployqt-master
cmake CMakeLists.txt

  inserte la descripción de la imagen aquí

  Debido a que la instalación de git puede estar mal con este proyecto, usamos directamente el código fuente para modificar Dafa, localizamos directamente el código y lo eliminamos:

vi CMakeList.txt

  Elimine directamente el archivo de caché en el directorio: CMakeCache.txt y luego continúe:
  inserte la descripción de la imagen aquí

  continuar cmake CMakeList.txt

Paso 4: configurar el entorno dependiente de Qt

  El propio sistema Kirin viene con una biblioteca qt5 (sin bibliotecas relacionadas con el desarrollo), y usamos un qt5 instalado adicionalmente, por lo que la dependencia debe introducirse en el qt5 que instalamos nosotros mismos.
  Para facilitar la configuración y no afectar el sistema, instalamos la versión gui de cmake:

sudo yum install cmake-gui

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

cmake-gui 

  Seleccione la ruta correspondiente y luego use la configuración predeterminada del archivo MAKE de Unix:
  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

Paso 5: generar generar

  inserte la descripción de la imagen aquí

Paso 6: Compilar make

  Corte en el directorio de compilación y use el comando make:

make

  inserte la descripción de la imagen aquí

  Programa de prueba:
  inserte la descripción de la imagen aquí

Paso 7: Instalar en el directorio del sistema

  Sin hacer la instalación, muévase manualmente a /usr/local/bin

sudo cp tools/linuxdeployqt/linuxdeployqt /usr/local/bin/

  inserte la descripción de la imagen aquí

Paso 8: Pruebe si la compilación es exitosa

  inserte la descripción de la imagen aquí


Proceso de empaquetado de linuxdeployqt (el brazo puede ver, esta versión de PC falló)

  (PD: después de empaquetar la máquina virtual, regrese a la versión bare metal y vuelva a probar)
  Cree un nuevo proyecto
  inserte la descripción de la imagen aquí

  Luego, busque un directorio vacío:
  inserte la descripción de la imagen aquí

  También se puede ejecutar en la máquina de desarrollo sin embalaje (bare metal no funciona):
  inserte la descripción de la imagen aquí

  Aquí para introducir Qt en el entorno, para no afectar el sistema, use el script de origen para importar y use source env.sh para importar antes de cada uso.

touch env.sh

  Luego ingrese lo siguiente (QT_DIR es la ruta donde está instalado Qt):

#!/bin/sh
QT_DIR=/home/yang/Qt5.12.8/5.12.8/gcc_64

export PATH=${QT_DIR}/bin:$PATH
export LIB_PATH=${QT_DIR}/lib:$LIB_PATH
export PLUGIN_PATH=${QT_DIR}/plugins:$PLUGIN_PATH
export QML2_PATH=${QT_DIR}/qml:$QML2_PATH
export LD_LIBRARY_PATH=${QT_DIR}/lib:$LD_LIBRARY_PATH

echo $PATH
echo $LIB_PATH
echo $PLUGIN_PATH
echo $QML2_PATH
echo $LD_LIBRARY_PATH

  inserte la descripción de la imagen aquí

  Importar el entorno:
  inserte la descripción de la imagen aquí

  Siga este proceso para empaquetar la próxima vez y continúe empaquetando:
  inserte la descripción de la imagen aquí

  (PD: no hay paquetes con sudo aquí, y el control de permisos puede ser más estricto, consulte " Entrando al pozo 2 ")
  Los siguientes usan sudo para empaquetar:

sudo linuxdeployqt testDemo -verbose2

  inserte la descripción de la imagen aquí

  Lo anterior es que la biblioteca Qt5Widget está conectada a la biblioteca del sistema, la versión es diferente y no se puede encontrar la API.
  La siguiente es la demostración de prueba sin empaquetar en la máquina de desarrollo:
  inserte la descripción de la imagen aquí

  Aquí está el testDemo sin empaquetar en bare metal:
  inserte la descripción de la imagen aquí


Implementar manualmente el paquete linuxdeployqt

Paso 1: poner la aplicación en el pasado

  inserte la descripción de la imagen aquí

  (Esta es una máquina de desarrollo, también es posible ejecutarla directamente)
  inserte la descripción de la imagen aquí

Paso 2: Crear qt.conf

  Este archivo es el más importante, al llamar a la aplicación testDemo carga primero y luego busca la configuración de la ruta de la biblioteca, sin ella irá a las variables de entorno del sistema.

touch qt.conf
vi qt.conf

  El contenido se copia del archivo empaquetado por otro Kirin doméstico, de la siguiente manera:
  inserte la descripción de la imagen aquí

# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml

  En este punto, lo ejecutamos de nuevo:
  inserte la descripción de la imagen aquí

  La ruta se encuentra localmente.

Paso 3: Realice la copia de las otras tres dependencias de carpetas

  inserte la descripción de la imagen aquí

ls -l
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/translations/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/plugins/ . -rf
cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/ . -rf
ls -lh

  inserte la descripción de la imagen aquí

  La máquina de prueba puede ejecutar:
  inserte la descripción de la imagen aquí

  (PD: aquí están todas las bibliotecas copiadas, sin recorte de dependencia, no importa por ahora, lleva mucho más tiempo de lo esperado)

Paso 4: empaque y coloque el metal desnudo

  Debido a que no hay recorte, el paquete es relativamente grande:

cd ..
tar cvf outManual.tar outManual
ls -l outManual.tar

  inserte la descripción de la imagen aquí

  Cópialo en bare metal.
  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

Paso 5: Ejecución de prueba en bare metal (fallido)

  Todavía falla, de la siguiente manera:
  inserte la descripción de la imagen aquí

  Esto sigue siendo lo mismo que antes, libQt5Widget.so.5 depende de libQt5Core.so.5, la configuración actual se usa al frente, y luego la biblioteca dependiente de la biblioteca se importa a /usr/lib64 , que es el mismo problema que el paquete anterior de linuxdeployqt.
  inserte la descripción de la imagen aquí

  Entonces tuve una idea, así que traté de agregar la prueba LD_LIBRARY_PATH, y puede ejecutarse correctamente. Consulte " Pit 4 " para obtener más detalles.

Paso 6: Introduzca la configuración QMAKE_RPATHDIR de runtime path pro al compilar

  Para no agregar variables de entorno adicionales en el tiempo de ejecución y evitar problemas de xcb en el empaquetado , debe modificar el archivo .pro como se muestra a continuación:

# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib

  inserte la descripción de la imagen aquí

  Después de compilar, coloque testDemo2 en el bare metal de implementación original:
  inserte la descripción de la imagen aquí
  finalmente, haga clic directamente para ejecutar correctamente.


en el hoyo

Pozo 1: compilar linuxdeployqt depende del problema de la ruta Qt

pregunta

  Al comenzar a compilar, deje que dependa del sistema, lo que lleva directamente al hecho de que incluso si se introducen otras variables de entorno qt, el empaquetado también depende del sistema y no se empaqueta directamente.
  inserte la descripción de la imagen aquí

razón

  Se sospecha que está relacionado con la dependencia de compilar linuxdeployqt, así que rehaga el cmake para instalar Qt usted mismo.

resolver

  Vuelva a hacerlo y compílelo después de instalar el cmake de Qt, sigue siendo el mismo.
  inserte la descripción de la imagen aquí

Entrada 2: El problema de que linuxdeployqt no copia

pregunta

  Como en la entrada anterior, no se copia, y no tiene nada que ver con las dependencias de compilación.

intentar

  De ninguna manera, seque directamente el código fuente de main.cpp de linuxdeployqt:
  1. Primero depure donde no hay impresión, después de cada modificación del código fuente y vuelva a compilar, implementar y luego empaquetar para ver el resultado de salida. (PD: se encuentra que qDebug() no da salida, pero qInfo() da salida)
  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  Reemplace todos los LogError con qInfo(), como se muestra a continuación:
  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  O no:
  inserte la descripción de la imagen aquí

  continuar:
  inserte la descripción de la imagen aquí

  Pregunta capciosa:
  inserte la descripción de la imagen aquí

  Hasta el momento se puede confirmar que es un problema de compatibilidad, este problema es más difícil y no se puede ajustar a corto plazo.

resolver

  El metodo linuxdeployqt todavia no se ha solucionado se puede cambiar la version de linuxdeployqt talvez una version diferente de uos no vuelva a tener este problema es raro que ni logError ni qDebug salgan
  Seguimiento, al día siguiente de repente pensé en si se necesita el permiso de sodu, lo probé y, de hecho, fue:
  inserte la descripción de la imagen aquí

  Así que lo rehice de nuevo y usé sudo para empaquetarlo.

Pozo 3: hay un error al confiar en la biblioteca de enlaces

pregunta

  inserte la descripción de la imagen aquí

  Esto es un conflicto con el sistema.
  El paquete de instalación también se usa al compilar:
  inserte la descripción de la imagen aquí

razón

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  Sin solución, no hay problema con qmake ruta y entorno disfrazados
  inserte la descripción de la imagen aquí

  verificar linuxdeployqt
  inserte la descripción de la imagen aquí

prueba 1

  Tome una instantánea, luego elimine todo /usr/lib64/Qt5* en el directorio, primero verifique si el sistema está habilitado normalmente y luego intente empaquetarlo.

sudo rm /usr/lib64/libQt5*

  Reinicie, de hecho, el sistema no puede iniciarse, el sistema depende de la biblioteca bajo Qt5.11.
  inserte la descripción de la imagen aquí

  Por lo tanto, no se puede eliminar, esta forma está muerta.

prueba 2

  Tome una instantánea, luego copie la biblioteca Qt5 instalada, primero verifique si el sistema está habilitado normalmente y luego intente empaquetarlo.
  Ejecute el comando copiar y la pantalla se pondrá negra inmediatamente, esta forma es diferente.
  Por lo tanto, la biblioteca en /usr/lib64 no se puede mover.
  inserte la descripción de la imagen aquí

  Aquí se sospecha que se ha ingresado una variable de entorno de prioridad fija desde que se ingresó a la terminal, solo se especula que linuxdeployqt actualmente está demorando otro medio día, y todavía no hay una solución por el momento.

Solución (un poco sesgada, fallida)

  Si no puede encontrar una biblioteca, elimine una biblioteca. En este momento, el sistema ha cargado la biblioteca en la memoria para ejecutarse, y no afectará el sistema en ejecución, pero no se puede reiniciar, de la siguiente manera:

sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Gui.so*

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Core.so*

  inserte la descripción de la imagen aquí

sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicuuc.so* /usr/lib64/

  inserte la descripción de la imagen aquí

sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicudata.so* /usr/lib64/

  inserte la descripción de la imagen aquí

sudo linuxdeployqt testDemo -verbose2
sudo yum install patchelf
sudo linuxdeployqt testDemo -verbose2

  inserte la descripción de la imagen aquí

  inserte la descripción de la imagen aquí

  ¡Sí, uos ganas, me rindo! ! !

Pozo 4: Implementación manual de imitación de qt.conf o cambio de ruta forzado

pregunta

  inserte la descripción de la imagen aquí

razón

  Analizando la segunda búsqueda del sistema de la librería, siempre será importada a /usr/lib64.Este problema es muy molesto.Desde el principio no se puede empaquetar linuxdeployqt.Esta es la causa principal.

resolver

  Al compilar directamente, la forma preferida es dejar que la aplicación se base en la ruta relativa cuando se ejecuta, en lugar de depender de las variables de entorno y los archivos de configuración en tiempo de ejecución.
  Pro se une al archivo de configuración:

# 这里是添加运行应用的时候的运行包,此处避免额外设置LD_LIBRARY_PATH
QMAKE_RPATHDIR = ./lib

  Cuando hace clic en la suerte de la aplicación, la aplicación en sí primero se basará en la búsqueda de la biblioteca en ./lib.


Anterior: " Notas de desarrollo del sistema Union UOS (6): después de extraer el software de instalación en línea, extraiga su paquete de instalación e implemente la máquina de destino para instalar el software usando un paquete de software fuera de línea" Siguiente
: " Notas de desarrollo del sistema Union UOS (8) ): Compile y construya el entorno básico mqtt en Tongxin UOS (la versión usa QMQTT::Clinet)


Si el artículo es un artículo original, indique la fuente del artículo original al reproducirlo.
La dirección del blog de este artículo: https://hpzwl.blog.csdn.net/article/details/131411975

Supongo que te gusta

Origin blog.csdn.net/qq21497936/article/details/131411975
Recomendado
Clasificación