Quiero ejecutar un binario de Linux desde una aplicación QT que se ejecuta en W10. En QT tenemos QProcess para lanzar procesos adicionales. Sin embargo, dado que mi binario es para Linux, he pensado en dos posibles enfoques:
En cualquier caso, la aplicación QT debería iniciar el proceso (el contenedor o el bash) y, a su vez, este proceso debería iniciar mi binario.
Estuve buscando en la web y no pude encontrar algo relacionado, lo que me hace pensar que sera dificil. Por esta razón, publico la pregunta para conocer la viabilidad de los enfoques propuestos.
EDITADO
Parece que WSL es más fácil, el problema es que el usuario tiene que haberlo instalado. Además de solicitar la contraseña de sudo al instalar un nuevo software a través de apt-get.
El binario que tengo que ejecutar solo existe para Linux, y digamos que la compilación cruzada se descarta debido a su complejidad. Además, esta aplicación necesita CGAL, BOOST, MPI, entre otras piezas de software.
Si desea usar WSL, simplemente puede ejecutar wsl myLinuxProgram --options .
Usar WSL es la forma más fácil, creo, ya que el directorio actual (PWD), es el actual, es decir, el mismo que el PWD de su aplicación Qt.
Puede leer la documentación de Microsoft para obtener más información: https://docs.microsoft.com/en-us/windows/wsl/interop
Si su binario de Linux depende de muchas cosas, realmente le sugiero que use Docker para Windows . Luego, tiene la oportunidad de crear previamente una imagen acoplable propia que coloque todo el software de dependencia y el binario de Linux que necesita para ejecutarlo.
Por supuesto, para permitir que su cliente lo use, debe ponerlo en dockerhub , registrar una cuenta para usted.
Entonces, la solución es simple: deje que la aplicación QT llame a la docker run para configurar un contenedor basado en su propia imagen, ejecútelo y también deje que el binario de Linux escriba el registro u otros en el volumen de montaje de enlace entre el contenedor de Linux y Windows . Después de ejecutarse, la aplicación QT obtiene la salida binaria de Linux de esta carpeta compartida.
Finalmente, doy un ejemplo mínimo viable para su referencia:
Supongamos que la carpeta compartida entre Windows y el contenedor de Linux es: C:\\abc\\log_share , se asignará al contenedor de Linux como carpeta /tmp . Por supuesto, debe permitir compartir el volumen haciendo clic con el botón derecho en el docker icon en el área de la bandeja de Windows y elija la configuración, como se describe aquí
Simplifique la aplicación de Windows como bat file y simplifique la imagen de la ventana acoplable como ubuntu , debe usar su propia imagen acoplable preconstruida con todas las dependencias en ella:
win_app.bat:
ECHO OFF ::New a shared folder with linux container RD /s/q C:\\abc\\log_share > NUL 2>&1 MKDIR C:\\abc\\log_share ::From windows call docker to execute linux command like 'echo' echo "Start to run linux binary in docker container..." docker run -it -v C:\\abc\\log_share:/tmp ubuntu:16.04 bash -c "echo 'helloworld' > /tmp/linux_log_here.txt" ::In windows, get the log from shared bind mount from linux echo "Linux binary run finish, print the log generated by the container..." type C:\\abc\\log_share\linux_log_here.txt Simplifique el binario de Linux al igual que el echo command en Linux, las cosas de salida deben escribirse en el directorio compartido:
echo 'helloworld' > /tmp/linux_log_here.txt Ahora, ejecute el archivo bat con el comando win_app.bat :
C:\abc>win_app.bat C:\abc>ECHO OFF "Start to run linux binary in docker container..." "Linux binary run finish, print the log generated by the container..." helloworld Puede ver que la aplicación de Windows ya podría obtener cosas (aquí está helloworld ) que generó el binario de Linux desde el contenedor docker.