我可以从Windows应用程序执行Linux二进制文件吗?

时间:2019-06-27 09:50:01

标签: qt docker kubernetes containers windows-subsystem-for-linux

我想从W10上运行的QT应用程序执行Linux二进制文件。 在QT中,我们有QProcess启动其他流程。但是,由于我的二进制文件是针对Linux的,因此我想到了两种可能的方法:

  1. 在容器中运行二进制文件(即:Docker,Kubernetes,Singularity ...)。
  2. 通过WSL(Ubuntu)bash执行二进制文件。

在任何情况下,QT应用程序都应启动该进程(容器或bash),并依次启动该二进制文件。

我一直在网上搜索,但是找不到相关的内容,这让我觉得这很困难。因此,我发布问题是为了了解所提出方法的可行性。

编辑

WSL似乎更容易,问题在于用户必须安装它。通过apt-get安装新软件时,除了需要sudo密码外。

我必须执行的二进制文件仅在Linux中存在,并且可以说由于其复杂性而忽略了交叉编译。此外,此应用还需要CGAL,BOOST,MPI等软件。

2 个答案:

答案 0 :(得分:11)

如果要使用WSL,只需运行wsl myLinuxProgram --options

我相信使用WSL是最简单的方法,因为当前目录(PWD)是当前目录,即与Qt应用程序的PWD相同。

您可以阅读Microsoft文档以获得更多信息:https://docs.microsoft.com/en-us/windows/wsl/interop

答案 1 :(得分:6)

如果您的Linux二进制文件取决于很多事情,我真的建议您使用docker for windows。然后,您将有机会预构建自己的docker映像,该映像会将所有依赖项软件也放入您需要在其中运行的linux二进制文件。

当然,要让您的客户使用它,您应该将其放入dockerhub,为您自己注册一个帐户。

然后,解决方案很简单:让QT应用程序调用{​​{1}}来基于您自己的映像设置一个容器,执行该容器,然后让linux二进制文件将日志或其他日志写入{{ 3}}在Linux容器和Windows中。运行后,QT应用程序从此共享文件夹中获取linux二进制输出。

最后,我给出一个最小的可行示例供您参考:

  • 假定Windows和Linux容器之间的共享文件夹为docker run,它将以C:\\abc\\log_share文件夹的形式映射到linux容器。当然,您需要通过右键单击Windows任务栏区域中的/tmp并选择设置(如所述的bind mount volume

  • )来允许卷共享
  • 将Windows应用程序简化为docker icon,并将docker镜像简化为bat file,您应该使用自己的预构建的docker镜像,其中包含所有依赖项:

    win_app.bat:

    ubuntu
  • 就像在Linux中的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

现在,使用命令echo 'helloworld' > /tmp/linux_log_here.txt 执行bat文件:

win_app.bat

您可以看到Windows应用程序已经可以从docker容器中获取Linux二进制文件生成的内容(这里为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 )。