我想从W10上运行的QT应用程序执行Linux二进制文件。
在QT中,我们有QProcess
启动其他流程。但是,由于我的二进制文件是针对Linux的,因此我想到了两种可能的方法:
在任何情况下,QT应用程序都应启动该进程(容器或bash),并依次启动该二进制文件。
我一直在网上搜索,但是找不到相关的内容,这让我觉得这很困难。因此,我发布问题是为了了解所提出方法的可行性。
编辑
WSL似乎更容易,问题在于用户必须安装它。通过apt-get安装新软件时,除了需要sudo密码外。
我必须执行的二进制文件仅在Linux中存在,并且可以说由于其复杂性而忽略了交叉编译。此外,此应用还需要CGAL,BOOST,MPI等软件。
答案 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
)。