Невозможно перекрестно скомпилировать программу C для совместимости на хосте Windows с Ubuntu VM

У меня проблемы с компиляцией программы C и ее запуском на 64-битной машине с Windows 7.

Вот мой сценарий:

#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
     bool isCaseSensitive = false;
     enum { CHARACTER_MODE, WORD_MODE, LINE_MODE } mode = CHARACTER_MODE;
     size_t optind;
     for (optind = 1; optind < argc && argv[optind][0] == '-'; optind++)
     {
         switch(argv[optind][1])
         {
             case 'h': isCaseSensitive = true; printf("Help page"); break;

         default:
             fprintf(stderr, "Usage: %s [-h]\n", argv[0]);
             exit(1);
        }
    }
}

Во-первых, я компилирую этот скрипт, используя Ubuntu 16.04 поверх vmware с хостом Windows 7. Когда я запускаю: gcc -m64 utilis.c -o utilis.exe, он компилируется, но если я запускаю его на своем хосте, я получаю эту ошибку:

введите здесь описание изображения

Если я попытаюсь скомпилировать его, используя 32-битную систему, и один из моих приятелей запустит ее на своей 32-битной машине, я получу следующее:

/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc.a when searching for -lgcc
/usr/bin/ld: cannot find -lgcc
/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.9/libgcc_s.so when searching for -lgcc_s
/usr/bin/ld: cannot find -lgcc_s
collect2: error: ld returned 1 exit status

Если я заставлю его запустить 64-битную версию, он получит эту ошибку:

введите здесь описание изображения

Что я пытался сделать по этому поводу:

e@ubuntu:/mnt/hgfs/devshare/utilis$ sudo apt-get install build-essential
Reading package lists... Done
Building dependency tree       
Reading state information... Done
build-essential is already the newest version (12.1ubuntu2).
0 upgraded, 0 newly installed, 0 to remove and 95 not upgraded.

e@ubuntu:/mnt/hgfs/devshare/utilis$ sudo apt-get install gcc-multilib
Reading package lists... Done
Building dependency tree       
Reading state information... Done
gcc-multilib is already the newest version (4:5.3.1-1ubuntu1).
gcc-multilib set to manually installed.
0 upgraded, 0 newly installed, 0 to remove and 95 not upgraded.

e@ubuntu:/mnt/hgfs/devshare/utilis$ export LDFLAGS='-m32 -L/usr/lib32'

e@ubuntu:/mnt/hgfs/devshare/utilis$ export LDFLAGS='-m64 -L/usr/lib64'

e@ubuntu:/mnt/hgfs/devshare/utilis$ sudo apt-get install g++-multilib
Reading package lists... Done
Building dependency tree       
Reading state information... Done
g++-multilib is already the newest version (4:5.3.1-1ubuntu1).
0 upgraded, 0 newly installed, 0 to remove and 95 not upgraded.

Как я могу заставить свою программу правильно скомпилироваться и быть кросс-совместимой с моей машиной с Windows 7?


person jakehimton    schedule 27.03.2017    source источник


Ответы (1)


Разобрался, нужно установить mingw toolchain для linux.

sudo apt-get install x86_64-w64-mingw32-g++
e@ubuntu:/mnt/hgfs/devshare/utilis$ mg++ utilis.c -o utilis.exe --static
C:\Users\z-perkins-thomas\Documents\bin\testenv\devshare\utilis>utilis.exe -h
Help page

вот пошаговое руководство по кросс-компиляции C программ для их запуска в Windows

person jakehimton    schedule 27.03.2017
comment
Ну, это то, что я упомянул, Cygwin или Mingw или другой набор инструментов для кросс-компиляции сделают эту работу. Наконец, отлично. - person danglingpointer; 28.03.2017