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

Can I execute a Linux binary from a Windows application?

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

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

在任何情况下,QT 应用程序都应该启动进程(容器或 bash),反过来,这个进程应该启动我的二进制文件。

我在网上找了很久也没找到相关的东西,怎么就觉得难。出于这个原因,我发布这个问题是为了了解所提议方法的可行性。

已编辑

看起来WSL更简单,问题是用户必须安装它。除了在通过 apt-get 安装新软件时需要 sudo 密码外。

我必须执行的二进制文件仅存在 Linux,假设交叉编译由于其复杂性而被取消。此外,此应用程序需要 CGAL、BOOST、MPI 等软件。

如果你想和WSL一起去,你可以 运行 wsl myLinuxProgram --options.

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

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

如果您的 linux 二进制文件依赖于很多东西,我真的建议您使用 docker for windows。然后,您有机会 pre-build 一个自己的 docker 映像,其中包含所有依赖软件以及您需要 运行 的 linux 二进制文件。

当然,要让你的客户使用它,你应该把它放到dockerhub,然后自己注册一个帐户。

那么,解决方法很简单:让QT应用程序调用docker run根据自己的镜像建立一个容器,执行它,同时让linux二进制文件写入日志或其他 linux 容器 & windows 中的 bind mount volume。在 运行 之后,QT 应用程序从此共享文件夹中获取 linux 二进制输出。

最后,我给出一个最小可行的例子供大家参考:

  • 假设windows和linux容器之间的共享文件夹是:C:\abc\log_share,它将映射到linux容器为/tmp 文件夹。当然,您需要通过右键单击 windows 托盘区域中的 docker icon 并选择设置来允许音量共享,如 here

  • 所述
  • 将windows应用程序简化为bat file,并将docker图像简化为ubuntu,您应该使用自己的预构建docker 包含所有依赖项的图像:

    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二进制简化为linux中的echo command,输出的东西应该全部写入共享目录:

    echo 'helloworld' > /tmp/linux_log_here.txt
    

现在,用命令win_app.bat执行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 应用程序已经可以从 docker 容器中获取由 linux 二进制文件生成的东西(这里是 helloworld)。