Come compilare per Windows su Linux con gcc / g ++?


119

Ho scritto alcuni effetti in C ++ (g ++) usando freeglut su Linux e li compilo con

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

Quindi mi chiedevo se è possibile fare in modo che g ++ crei eseguibili Windows compilati statici che contengono tutto il necessario?

Non ho Windows, quindi sarebbe davvero fantastico, se potessi farlo su Linux :)


4
@AndiDog, "Prima dose gratis", giusto. Ad ogni modo, non è necessario impostare un processo di compilazione automatizzato su macchina Windows, mentre ne hai uno completo e funzionante per Linux.
P Shved

Come testeresti il ​​tuo software Windows senza Windows? Usi il vino?
el.pescado

7
@ el.pescado, la creazione e il test sono compiti completamente diversi. Windows non è necessario per il primo.
P Shved

Risposte:


92

mingw32 esiste come pacchetto per Linux. È possibile eseguire la compilazione incrociata e il collegamento di applicazioni Windows con esso. C'è un tutorial qui nel forum Code :: Blocks . Tieni presente che il comando cambia in x86_64-w64-mingw32-gcc-win32, ad esempio.

Ubuntu, ad esempio, ha MinGW nei suoi repository:

$ 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
Se usi Debian, mingw32 è già nel repository, insieme a poche librerie precompilate.
liori

1
Bene, c'è un ambiente di compilazione incrociata su nongnu.org/mingw-cross-env . Include freeglut, per esempio. Ma non l'ho usato, quindi non chiedermelo;)
AndiDog

4
Il "32" in mingw32 significa che posso produrre solo un file binario a 32 bit? Esiste una soluzione per produrre anche un file binario a 64 bit?
bluenote10

1
bluenote10: ci sono varianti che vengono compilate per x64, come "x86_64-w64-mingw32-g ++". La base "mingw32" può o non può essere in grado, ma è abbastanza facile installare / utilizzare le varianti per nome. ar2015: Non supporta affatto C ++ 11 o stai parlando di un problema che hai avuto con esso? Sto lavorando per ottenere un progetto da costruire con mingw mentre parliamo e questa sarebbe una buona informazione da sapere. Altri thread indicano che supporta c ++ 11 (ad esempio stackoverflow.com/questions/16136142/… ). Ovviamente sarei felice di aiutarti, ma un post separato sarebbe meglio per questo.
John P

1
Le cose su questi argomenti sono cambiate di recente?
Montreal

30

Un'opzione di compilazione per Windows in Linux è tramite mingw. Ho trovato un tutorial molto utile qui .

Per installare mingw32 su sistemi basati su Debian, eseguire il seguente comando:
sudo apt-get install mingw32

Per compilare il tuo codice, puoi usare qualcosa come:
i586-mingw32msvc-g++ -o myApp.exe myApp.cpp

A volte vorrai testare la nuova applicazione Windows direttamente in Linux. Puoi usare il vino per questo, anche se dovresti sempre tenere a mente che il vino potrebbe avere insetti. Ciò significa che potresti non essere sicuro che un bug sia in wine, nel tuo programma o in entrambi, quindi usa wine solo per test generali.

Per installare wine, esegui:
sudo apt-get install wine


7
non è necessario specificare mingw32-binutilse mingw32-runtimepoiché sono dipendenze dimingw32
henje

bello, il cpp aveva errori molto semplici ( void main(){}ecc ...), immagino che si compili su Windows ma fallisca su mingw, li ho risolti. Ho provato anche i586-mingw32msvc-cppe ha generato un file di testo con qualcosa del genere da compilare lol .. quello g ++ ha funzionato, grazie!
Aquarius Power

2
@henje per essere accurati, se non li specifichi, possono essere rimossi automaticamente dal gestore dei pacchetti durante la disinstallazione mingw32(contrassegnati come "dipendenze". Se li specifichi, non lo faranno (contrassegnati come "manuali").
Matthieu

19

Il metodo suggerito mi ha dato un errore su Ubuntu 16.04: E: Impossibile individuare il pacchetto mingw32

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

Per installare questo pacchetto su Ubuntu, utilizzare quanto segue:

sudo apt-get install mingw-w64

Dopo l'installazione puoi usarlo:

x86_64-w64-mingw32-g++

Notare che!

Per l'utilizzo a 64 bit: x86_64-w64-mingw32-g ++

Per l'utilizzo a 32 bit: i686-w64-mingw32-g ++


14

Installa un compilatore incrociato, come mingw64 dal tuo gestore di pacchetti. Quindi compilare nel modo seguente: invece di chiamare semplicemente gcccall i686-w64-mingw32-gccper Windows a 32 bit o x86_64-w64-mingw32-gcc"per Windows a 64 bit. Vorrei anche utilizzare l' --staticopzione, poiché il sistema di destinazione potrebbe non avere tutte le librerie.

Se vuoi compilare un altro linguaggio, come Fortran, sostituiscilo -gcccon -gfortrannei comandi precedenti.


7

Ho usato mingw su Linux per creare eseguibili Windows in C, sospetto che anche C ++ funzionerebbe.

Ho un progetto, ELLCC, che i pacchetti clangano e altre cose come una catena di strumenti del compilatore incrociato. Lo uso per compilare clang (C ++), binutils e GDB per Windows. Segui il link per il download su ellcc.org per i binari precompilati per diversi host Linux.


1
Da quando ho pubblicato quella risposta, sono andato un po 'oltre. Ho un progetto, ELLCC, che i pacchetti clangano e altre cose come una catena di strumenti del compilatore incrociato. Lo uso per compilare clang (C ++), binutils e GDB per Windows. Segui il link per il download su ellcc.org per i binari precompilati per diversi host Linux.
Richard Pennington

5

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

A partire da Fedora 17 è possibile creare facilmente binari (cross-compilazione) per i target win32 e win64. Ciò viene realizzato utilizzando la toolchain mingw-w64: http://mingw-w64.sf.net/ . L'utilizzo di questa toolchain ti consente di creare file binari per i seguenti linguaggi di programmazione: C, C ++, Objective-C, Objective-C ++ e Fortran.

"Suggerimenti e trucchi per l'utilizzo del cross-compilatore di Windows": https://fedoraproject.org/wiki/MinGW/Tips


3

per Fedora è

sudo yum groupinstall -y "MinGW cross-compiler"

1
Per tutti gli utenti Fedora: c'è un ottimo tutorial qui: fedoraproject.org/wiki/MinGW (modificato perché collegamento sbagliato)
LemurPwned

Esattamente quello che stavo cercando! Funziona sudo dnf groupinstall ...anche con .
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.