我可以从 Windows 应用程序执行 Linux 二进制文件吗?
Can I execute a Linux binary from a Windows application?
我想在 W10 上从 QT 应用程序 运行 执行 Linux 二进制文件。
在 QT 中,我们有 QProcess
来启动其他进程。但是,由于我的二进制文件是 Linux,我想到了两种可能的方法:
- 运行 容器中的二进制文件(即:Docker、Kubernetes、Singularity...)。
- 通过 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
)。
我想在 W10 上从 QT 应用程序 运行 执行 Linux 二进制文件。
在 QT 中,我们有 QProcess
来启动其他进程。但是,由于我的二进制文件是 Linux,我想到了两种可能的方法:
- 运行 容器中的二进制文件(即:Docker、Kubernetes、Singularity...)。
- 通过 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
)。