Могу ли я выполнить бинарный файл Linux из приложения Windows? - PullRequest
8 голосов
/ 27 июня 2019

Я хочу выполнить бинарный файл Linux из приложения QT, работающего на W10.В QT у нас есть QProcess для запуска дополнительных процессов.Однако, поскольку мой двоичный файл предназначен для Linux, я подумал о двух возможных подходах:

  1. Запуск двоичного файла в контейнере (т. Е. Docker, Kubernetes, Singularity ...).
  2. Выполнение двоичного файла через WSL (Ubuntu) bash.

В любом случае приложение QT должно инициировать процесс (контейнер или bash) и, в свою очередь, этот процесс должен запустить мой двоичный файл..

Я искал в Интернете и не смог найти что-то связанное, что заставляет меня думать, что это будет сложно.По этой причине я отправляю вопрос, чтобы узнать жизнеспособность предложенных подходов.

EDITED

Похоже, что WSL проще, проблема в том, что пользователь должен иметьустановить его.Помимо необходимости запрашивать пароль sudo при установке нового программного обеспечения через apt-get.

Бинарный файл, который мне нужно выполнить, существует только для Linux, и допустим, что кросс-компиляция отклоняется из-за его сложности.Кроме того, это приложение требует CGAL, BOOST, MPI и других программ.

Ответы [ 2 ]

11 голосов
/ 28 июня 2019

Если вы хотите использовать WSL, вы можете просто запустить wsl myLinuxProgram --options.

Использование WSL - это самый простой способ, который, как я считаю, является текущим каталогом (PWD), то есть текущим, то есть таким же, как PWD вашего приложения Qt.

Вы можете прочитать документацию Microsoft для получения дополнительной информации: https://docs.microsoft.com/en-us/windows/wsl/interop

6 голосов
/ 06 июля 2019

Если ваш бинарный linux зависит от многих вещей, я действительно рекомендую вам использовать docker для windows .Затем у вас есть возможность предварительно создать собственный образ докера, в который помещается все программное обеспечение для зависимостей, а также исполняемый файл linux, необходимый для его запуска.

Конечно, чтобы позволить вашему клиенту использовать его, вы должны поместить егона dockerhub , зарегистрируйте учетную запись для себя.

Тогда решение простое: позвольте приложению QT вызвать docker run, чтобы настроить базу контейнера на собственном образе, выполнить его,а также позвольте бинарному файлу linux записать журнал или другие данные в том подключения bind среди контейнера и окон linux.После запуска приложение QT извлекает двоичный вывод linux из этой общей папки.

Наконец, я приведу минимальный работоспособный пример для вашей справки:

  • Предположим, что общий ресурспапка между контейнером windows & linux: C:\\abc\\log_share, она будет сопоставлена ​​с контейнером linux как папка /tmp.Конечно, вам нужно разрешить общий объем, щелкнув правой кнопкой мыши docker icon в области уведомлений Windows и выбрав настройки, как описано здесь

  • Упростите приложение Windows как bat file, и упростите образ докера как ubuntu, вы должны использовать свой собственный готовый образ докера со всеми зависимостями в нем:

    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
    
  • Упростите двоичный файл linux так же, как echo command в linux, все выходные данные должны быть записаны в общий каталог:

    echo 'helloworld' > /tmp/linux_log_here.txt
    

Теперь выполните командуbat-файл с командой 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

Вы можете видеть, что приложение Windows уже может извлекать вещи (здесь helloworld), сгенерированные двоичным файлом linux из контейнера Docker.

...