Can I execute a Linux binary from a Windows application?

6/27/2019

I want to execute a Linux binary from a QT application running on W10. In QT we have QProcess to launch additional processes. However, since my binary is for Linux, I've thought of two possible approaches:

  1. Running the binary in a container (i.e.: Docker, Kubernetes, Singularity...).
  2. Executing the binary through WSL (Ubuntu) bash.

In any case, the QT application should initiate the process (the container or the bash) and, in turn, this process should launch my binary.

I've been searching on the web and I could not find something related, what makes me think that it will be difficult. For this reason, I am posting the question in order to know the viability of the proposed approaches.

EDITED

It looks like the WSL is easier, the problem is that the user has to have install ed it. Apart from requiring the sudo password when installing new software via apt-get.

The binary that I have to execute only exists for Linux, and let's say that cross-compiling is dismissed because of its complexity. Furthermore, this application needs CGAL, BOOST, MPI, among other pieces of software.

-- Bub Espinja
containers
docker
kubernetes
qt
windows-subsystem-for-linux

2 Answers

6/28/2019

If you want to go with WSL, you can just run wsl myLinuxProgram --options.

Using WSL is the easiest way I believe as the current directory (PWD), is the current one i.e. the same as the PWD of your Qt app.

You can read Microsoft documenation for more info: https://docs.microsoft.com/en-us/windows/wsl/interop

-- Benjamin T
Source: StackOverflow

7/6/2019

If your linux binary depends on a lots of things, I really suggest you use docker for windows. Then, you have chance to pre-build an own docker image which put all dependency software also the linux binary you need to run in it.

Of course, to let your customer to use it, you should put it to dockerhub, register an account for yourself.

Then, the solution is simple: let the QT application to call docker run to setup a container base on your own image, execute it, and also let the linux binary to write the log or others to the bind mount volume among linux container & windows. After it run, the QT application fetch the linux binary output from this shared folder.

Finally, I give a minimal workable example for your reference:

  • Suppose the shared folder between windows & linux container is: C:\\abc\\log_share, it will mapped to linux container as /tmp folder. Of course you need to allow volume share by right click the docker icon in windows tray area & choose settings, like described here

  • Simplify the windows application as bat file, and simplfy the docker image as ubuntu, you should use your own prebuilt docker image with all dependency in it:

    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
  • Simplify the linux binary just as echo command in linux, the output things should be all write to shared directory:

    echo 'helloworld' > /tmp/linux_log_here.txt

Now, execute the bat file with command win_app.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

You can see the windows application already could fetch things(here is helloworld) which generated by linux binary from docker container.

-- atline
Source: StackOverflow