【问题标题】:Can I execute a Linux binary from a Windows application?我可以从 Windows 应用程序执行 Linux 二进制文件吗?
【发布时间】:2019-11-09 07:41:39
【问题描述】:

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

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

无论如何,QT 应用程序应该启动进程(容器或 bash),然后这个进程应该启动我的二进制文件。

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

已编辑

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

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

【问题讨论】:

  • 这个 linux 二进制文件运行后你期望什么?你得到输出,然后在windows应用程序中使用,或者让它运行可以吗?我想这会使解决方案走向不同的方向。
  • @atline 输出写在一系列目录中,我应该能够从 Windows 应用程序访问这些目录。在 WSL 的情况下,很容易从目录中获取数据。而对于容器,我应该将数据复制到一些可访问的地方。
  • 所以我想在容器和窗口之间绑定挂载是一种方式,请看我的回答。

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


【解决方案1】:

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

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

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

【讨论】:

  • 我已经编辑了这个问题,添加了一些我们可以使用 wsl 的问题。例如,执行 apt-get 时需要密码。
  • 您可以配置 sudo 使其不需要密码。但是您谈到了运行 Linux 二进制文件,而不是运行管理任务。如果您可以访问源代码,则可以尝试使用 cygwin 编译二进制文件。
  • 我想自动化 Ubuntu 配置过程,使其对用户透明。该配置涉及安装依赖项...
  • @BubEspinja 好吧,安装依赖项有点超出“执行 linux 二进制文件”的范围。特别是因为 WSL 需要安装几个步骤(开发者模式、WSL 组件、分发安装和初始化)。此外,您需要提示用户输入 sudo 密码也是正常的,您的程序不应该在用户不知道并允许的情况下拥有管理权限。
【解决方案2】:

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

当然,为了让你的客户使用它,你应该把它发送到dockerhub,自己注册一个帐户。

然后,解决方法很简单:让QT应用程序调用docker run在你自己的镜像上建立一个容器,执行它,同时让linux二进制文件将日志或其他写入到bind mount volume当中linux容器和windows。运行后,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)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-06
    • 1970-01-01
    • 1970-01-01
    • 2020-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多