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.