Jak skompilować dla systemu Windows w systemie Linux z gcc / g ++?


119

Napisałem kilka efektów w C ++ (g ++) używając freeglut na Linuksie i kompiluję je z

g++ -Wall -lglut part8.cpp -o part8

Więc zastanawiałem się, czy jest możliwe, aby g ++ tworzyło statycznie skompilowane pliki wykonywalne Windows, które zawierają wszystko, czego potrzeba?

Nie mam Windowsa, więc byłoby fajnie, gdybym mógł to zrobić na Linuksie :)


4
@AndiDog, "Pierwsza dawka za darmo", racja. W każdym razie konfigurowanie automatycznego procesu kompilacji na komputerze z systemem Windows, gdy masz ukończoną i działającą kompilację dla systemu Linux, jest niepotrzebne.
P Shved

Jak przetestowałbyś swoje oprogramowanie Windows bez Windows? Używasz wina?
el.pescado

7
@ el.pescado, budowanie i testowanie to zupełnie inne zadania. W pierwszym przypadku system Windows jest niepotrzebny.
P Shved

Odpowiedzi:


92

mingw32 istnieje jako pakiet dla systemu Linux. Za jego pomocą można krzyżowo kompilować i łączyć aplikacje Windows. Na forum Code :: Blocks znajduje się samouczek . Pamiętaj, że polecenie zmienia się x86_64-w64-mingw32-gcc-win32na przykład na.

Na przykład Ubuntu ma MinGW w swoich repozytoriach:

$ apt-cache search mingw
[...]
g++-mingw-w64 - GNU C++ compiler for MinGW-w64
gcc-mingw-w64 - GNU C compiler for MinGW-w64
mingw-w64 - Development environment targeting 32- and 64-bit Windows
[...]

3
Jeśli używasz Debiana, mingw32 jest już w repozytorium, razem z kilkoma prekompilowanymi bibliotekami.
liori

1
Cóż, na nongnu.org/mingw-cross-env jest środowisko kompilacji krzyżowej . Obejmuje na przykład freeglut. Ale ja tego nie użyłem, więc nie pytaj mnie o to;)
AndiDog

4
Czy „32” w mingw32 oznacza, że ​​mogę utworzyć tylko 32-bitowy plik binarny? Czy istnieje rozwiązanie umożliwiające również utworzenie 64-bitowego pliku binarnego?
bluenote10

1
bluenote10: istnieją warianty kompilacji dla x64, takie jak „x86_64-w64-mingw32-g ++”. Baza „mingw32” może, ale nie musi, być w stanie, ale wystarczy zainstalować / używać wariantów według nazwy. ar2015: Czy w ogóle nie obsługuje C ++ 11, czy też mówisz o problemie, który miałeś z nim? Pracuję nad uzyskaniem projektu do zbudowania za pomocą mingw, gdy mówimy, i dobrze byłoby to wiedzieć. Inne wątki wskazują, że obsługuje c ++ 11 (np. Stackoverflow.com/questions/16136142/ ... ). Oczywiście chętnie pomogę, ale osobny wpis byłby do tego najlepszy.
John P

1
Czy ostatnio coś się zmieniło?
Montreal,

30

Jedną z opcji kompilacji dla systemu Windows w systemie Linux jest mingw. Znalazłem bardzo pomocny samouczek tutaj .

Aby zainstalować mingw32 w systemach opartych na Debianie, uruchom następujące polecenie:
sudo apt-get install mingw32

Aby skompilować swój kod, możesz użyć czegoś takiego:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

Czasami będziesz chciał przetestować nową aplikację Windows bezpośrednio w systemie Linux. Możesz użyć do tego wina, chociaż zawsze pamiętaj, że wino może mieć błędy. Oznacza to, że możesz nie być pewien, że błąd jest w wine, twoim programie lub w obu, więc używaj wine tylko do ogólnych testów.

Aby zainstalować wino, uruchom:
sudo apt-get install wine


7
nie musisz określać, mingw32-binutilsa mingw32-runtimeponieważ są to zależnościmingw32
henje

fajnie, cpp miał bardzo proste błędy ( void main(){}itp ...), myślę, że kompiluje się w Windows, ale nie działa w mingw, naprawiłem je. Spróbowałem też i586-mingw32msvc-cppi wygenerował plik tekstowy z czymś w rodzaju rzeczy do skompilowania lol .. g ++ działał, thx!
Aquarius Power

2
@henje dokładnie, jeśli ich nie określisz, mogą zostać automatycznie usunięte przez menedżera pakietów podczas odinstalowywania mingw32(oznaczone jako „zależności”. Jeśli je określisz, nie będą (oznaczone jako „ręczne”).
Matthieu

19

Sugerowana metoda spowodowała błąd w systemie Ubuntu 16.04: E: Nie można zlokalizować pakietu mingw32

==================================================== =========================

Aby zainstalować ten pakiet w systemie Ubuntu, użyj następującego:

sudo apt-get install mingw-w64

Po instalacji możesz z niego korzystać:

x86_64-w64-mingw32-g++

Proszę zanotować!

Do użytku 64-bitowego: x86_64-w64-mingw32-g ++

Do użytku 32-bitowego: i686-w64-mingw32-g ++


14

Zainstaluj kompilator krzyżowy, taki jak mingw64 z menedżera pakietów. Następnie skompiluj w następujący sposób: zamiast po prostu wywoływać gcccall i686-w64-mingw32-gccdla 32-bitowego Windows lub x86_64-w64-mingw32-gcc"64-bitowego Windows. Użyłbym również tej --staticopcji, ponieważ system docelowy może nie mieć wszystkich bibliotek.

Jeśli chcesz skompilować innego języka, jak Fortran, wymienić -gccsię -gfortranw poprzednich poleceń.


7

Użyłem mingw na Linuksie do tworzenia plików wykonywalnych Windows w C, podejrzewam, że C ++ również zadziała.

Mam projekt, ELLCC, który zawiera pakiety clang i inne rzeczy jako łańcuch narzędzi kompilatora krzyżowego. Używam go do kompilacji clang (C ++), binutils i GDB dla Windows. Kliknij łącze pobierania na stronie ellcc.org, aby uzyskać wstępnie skompilowane pliki binarne dla kilku hostów Linux.


1
Odkąd opublikowałem tę odpowiedź, poszedłem trochę dalej. Mam projekt, ELLCC, który zawiera pakiety clang i inne rzeczy jako łańcuch narzędzi kompilatora krzyżowego. Używam go do kompilacji clang (C ++), binutils i GDB dla Windows. Kliknij łącze pobierania na stronie ellcc.org, aby uzyskać wstępnie skompilowane pliki binarne dla kilku hostów z systemem Linux.
Richard Pennington

5

Od: https://fedoraproject.org/wiki/MinGW/Tutorial

Od Fedory 17 można łatwo budować (cross-kompilować) pliki binarne dla celów win32 i win64. Jest to realizowane za pomocą łańcucha narzędzi mingw-w64: http://mingw-w64.sf.net/ . Korzystanie z tego zestawu narzędzi umożliwia tworzenie plików binarnych dla następujących języków programowania: C, C ++, Objective-C, Objective-C ++ i Fortran.

„Wskazówki i porady dotyczące korzystania z kompilatora krzyżowego systemu Windows”: https://fedoraproject.org/wiki/MinGW/Tips


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.