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
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:
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
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):
O continúe modificando el método anterior:
vi linuxdeployqt-master/tools/linuxdeployqt/main.cpp
Paso 3: Usa la configuración de cmake
cd linuxdeployqt-master
cmake CMakeLists.txt
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:
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
cmake-gui
Seleccione la ruta correspondiente y luego use la configuración predeterminada del archivo MAKE de Unix:
Paso 5: generar generar
Paso 6: Compilar make
Corte en el directorio de compilación y use el comando make:
make
Programa de prueba:
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/
Paso 8: Pruebe si la compilación es exitosa
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
Luego, busque un directorio vacío:
También se puede ejecutar en la máquina de desarrollo sin embalaje (bare metal no funciona):
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
Importar el entorno:
Siga este proceso para empaquetar la próxima vez y continúe empaquetando:
(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
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:
Aquí está el testDemo sin empaquetar en bare metal:
Implementar manualmente el paquete linuxdeployqt
Paso 1: poner la aplicación en el pasado
(Esta es una máquina de desarrollo, también es posible ejecutarla directamente)
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:
# Generated by linuxdeployqt
# https://github.com/probonopd/linuxdeployqt/
[Paths]
Prefix = ./
Plugins = plugins
Imports = qml
Qml2Imports = qml
En este punto, lo ejecutamos de nuevo:
La ruta se encuentra localmente.
Paso 3: Realice la copia de las otras tres dependencias de carpetas
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
La máquina de prueba puede ejecutar:
(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
Cópialo en bare metal.
Paso 5: Ejecución de prueba en bare metal (fallido)
Todavía falla, de la siguiente manera:
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.
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
Después de compilar, coloque testDemo2 en el bare metal de implementación original:
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.
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.
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)
Reemplace todos los LogError con qInfo(), como se muestra a continuación:
O no:
continuar:
Pregunta capciosa:
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:
Así que lo rehice de nuevo y usé sudo para empaquetarlo.
Pozo 3: hay un error al confiar en la biblioteca de enlaces
pregunta
Esto es un conflicto con el sistema.
El paquete de instalación también se usa al compilar:
razón
Sin solución, no hay problema con qmake ruta y entorno disfrazados
verificar linuxdeployqt
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.
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.
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*
sudo linuxdeployqt testDemo -verbose2
sudo rm /usr/lib64/libQt5Core.so*
sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicuuc.so* /usr/lib64/
sudo linuxdeployqt testDemo -verbose2
sudo cp /home/yang/Qt5.12.8/5.12.8/gcc_64/lib/libicudata.so* /usr/lib64/
sudo linuxdeployqt testDemo -verbose2
sudo yum install patchelf
sudo linuxdeployqt testDemo -verbose2
¡Sí, uos ganas, me rindo! ! !
Pozo 4: Implementación manual de imitación de qt.conf o cambio de ruta forzado
pregunta
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