2015-08-20 19 views
8

Sono quasi sicuro che il mio problema è dovuto al fatto che il programma compilato è compilato come un eseguibile di Linux, ma voglio solo ricontrollarlo.Perché un programma compilato Linux non funziona su Windows

#include <stdio.h> 
#include <stdlib.h> 
int main() 
{ 
    printf("Hello world!\n"); 
    return EXIT_SUCCESS; 
} 

Il "programma" di cui sopra dovrebbe compilare su Windows e Linux bene, dal momento che è il codice sorgente compatibile, in quanto non esistono librerie specifiche del sistema operativo o qualcosa di simile.

Tuttavia, quando digito "c99 ciao.c -o hello.exe" sulla mia macchina Linux, e poi trasferisco tale "eseguibile" su una macchina Windows, si rifiuta di eseguire. Da quanto ho capito, Linux genera un file eseguibile che funziona solo su linux, quindi l'aggiunta di ".exe" non ha alcun effetto. Per costruire quel programma su Linux per Windows, avrei bisogno di ricompilare quel programma su una macchina Windows? Oppure c'è un altro metodo più semplice che funzionerà?

+8

Stai capendo (fondamentalmente) giusto. L'eseguibile su diversi SO ha diversi formati (e diversi modelli di esecuzione). –

+2

L'altro metodo è denominato "cross-compilation". –

+0

Linux usa ELF per i suoi binari. – Alexguitar

risposta

19

file eseguibili di Windows e Linux utilizzano due diversi formati incompatibili:

Su Windows, ad esempio l'Portable Executable format.

Su Linux è lo ELF (Executable and Linkable Format).

Ogni formato utilizza le specificità del sistema operativo su cui devono essere eseguite, in modo che non possano essere normalmente eseguite su un'altra piattaforma.

Inoltre, un eseguibile contiene solo una piccola porzione del codice che viene eseguita dopo essere stata caricata in memoria. Un file eseguibile è collegato a librerie di sistema che forniscono la maggior parte delle funzionalità che consentono al programma di interagire con il sistema.
Poiché i sistemi sono molto diversi tra loro, le librerie variano e un programma per esempio Linux non può essere eseguito su FreeBSD nonostante quest'ultimo utilizzi anche ELF, perché non sono collegati alle stesse librerie.

Per compilare un eseguibile di Windows su Linux, è possibile utilizzare una tecnica nota come cross-compilation. Un compilatore è dopotutto solo un programma che scrive in un file binario, quindi qualsiasi compilatore può in teoria scrivere codice per qualsiasi piattaforma, purché le librerie del sistema di destinazione siano disponibili per essere collegate.

Il progetto MinGW-w64 fornisce una toolchain che consente questo. Ad esempio, è possibile installarlo su sistemi basati su Debian utilizzando il comando sudo apt-get install mingw-w64.

Gli eseguibili installati possono essere utilizzati in questo modo:

i686-w64-mingw32-gcc hello.c -o hello32.exe  # 32-bit 
x86_64-w64-mingw32-gcc hello.c -o hello64.exe # 64-bit 
+0

Si noti che non è tutto ciò che conta: ad esempio, sia OpenBSD che Linux usano ELF per i loro binari, ma non è possibile eseguire binari di Linux su OpenBSD. D'altra parte, è possibile eseguire binari di Windows su Linux con l'aiuto di Wine. – fuz

+0

@FUZxxl buoni punti. Credo che ci sia un livello di emulazione compat_linux per OpenBSD che consente ai binari di Linux di funzionare lì, però. – SirDarius

+2

Quello che sto cercando di suggerire è che il formato binario è un'aringa rossa rispetto a questa domanda. La vera risposta è che il sistema operativo con cui il binario tenta di interagire non è lo stesso e, a meno che non ci sia una sorta di livello di traduzione delle chiamate di sistema, il binario non può essere eseguito. – fuz

0

La sua una situazione di compilazione, diferently da Java exe non hanno alcun macchina virtuale per interpretare il codice in OS spettacolo diverso. Quindi ha bisogno di avere tutte le specifiche .dll e lib dal sistema operativo per eseguire il lavoro per cui è stato creato.

In .exe tutte le cose sono fatte per funzionare su un sistema operativo specifico, in un altro modo in Java una macchina virtuale è la magia che interpreta ed esegue il tuo codice su diferent OS.

Problemi correlati