2010-11-03 16 views
10

È possibile compilare un file di origine c/C++ per generare un file .exe che può essere eseguito su altri processori su computer diversi? Sto chiedendo questo per la piattaforma Windows. So che può essere fatto con java o C#, ma usa la macchina virtuale.Come posso creare un eseguibile portatile?

PS: per chi ha detto che può essere fatto solo con macchine virtuali o il codice sorgente deve essere compilato su ogni macchina, sto chiedendo se tutti i virus sono scritti in java o C# e hai bisogno di una macchina VM per essere infetto o hai bisogno di compilare codice sorgente di worm sul tuo computer per essere infetto? (Non sto cercando di fare un virus, ma è un buon esempio :))

+5

stesso sistema operativo o no? Questa è la domanda. – leppie

+0

L'estensione .exe implica COFF o può essere ELF o qualsiasi altro formato binario? Questa è un'altra domanda ... –

+0

Sì, stesso SO (in questo caso Windows). – Stefan

risposta

22

Diversi computer utilizzano set di istruzioni differenti, chiamate di sistema operativo, ecc., Motivo per cui il codice macchina è specifico per la piattaforma. Questo è il motivo per cui varie tecnologie come codice byte, macchine virtuali, ecc. Sono state sviluppate per consentire eseguibili portatili. Tuttavia, generalmente C/C++ compila direttamente sul codice macchina specifico della piattaforma.

Quindi un Windows exe semplicemente non funzionerà su un'altra piattaforma senza alcun tipo di livello di emulazione.

Tuttavia, è possibile rendere portatile il codice sorgente C/C++ . Ciò significa che tutto ciò che devi fare per far funzionare la tua applicazione su un'altra piattaforma è compilarlo per quella piattaforma.

3

La risposta breve è - non è possibile. La risposta più lunga è scrivere in C/C++ portatile (standard) e compilare sulle piattaforme necessarie.

+1

No, la risposta più lunga è possibile, ma probabilmente non si vuole. (Compilare ad esempio il codice byte Java.) –

+4

@Amigable Ci sono molte piattaforme per le quali non esiste JVM, ma ha un compilatore C compatibile. –

+0

sì assolutamente, ma quella non era la domanda originale. –

1

È possibile, tuttavia, farlo in una lingua diversa. Se hai bisogno di qualcosa da eseguire su piattaforme multiple, ti suggerisco di investigare su Java. Linguaggio simile a c/C++, e puoi "compilare" (sorta di) programmi per girare praticamente su qualsiasi computer.

+2

Non vedo come java sia simile a C/C++ –

+0

@Armen Tsirunyan: Abbastanza semplice: Java è basato su C++. – Gorpik

+0

@Gorpik: sintatticamente - forse, ma il paradigma delle due lingue è abbastanza diverso –

12

Sì, è possibile, ma non è necessariamente una buona idea.

Apple ha introdotto l'idea di un fat binary quando sono stati la migrazione da Motorola 68000 per i chip PowerPC di nuovo nei primi anni '90 (non sto dicendo che ha inventato, questo è solo il prima incarnazione io sappia). Quel collegamento descrive anche i binari universali di FatELF Linux ma, dato il poco che sentiamo su di loro, sembra che non siano decollati.

Questo era un singolo file che in pratica conteneva entrambi i file eseguibili 68000 e PowerPc raggruppati in un singolo file e richiedeva alcune risorse dal sistema operativo in modo che potesse caricare ed eseguire quello pertinente.

Si potrebbe, se tu fossi così inclinato, scrive un compilatore che ha prodotto un binario grasso che avrebbe eseguito su un gran numero di piattaforme, ma:

  • sarebbe orribilmente grandi dimensioni; e
  • richiederebbe quasi certamente caricatori speciali su ciascun sistema di destinazione.

Dal gcc ha una quantità enorme di supporto per diverse piattaforme e cross-compiling tale, sarebbe dove avrei concentrare l'impegno, se io abbastanza pazzo da provare :-)

+11

+1 Solo per l'accattivante suggerimento di scrivere un compilatore. –

+1

Apple lo fa ancora. I "binari universali" contengono sia i binari PPC che quelli Intel. edit: non è in realtà un singolo binario, i diversi binari (e le icone simili ai metadati) sono contenuti in una directory che ha un'estensione "app". –

+0

Si potrebbe considerare l'utilizzo di clang, anche se è molto sottosviluppato e potrebbe richiedere la spedizione clang con il binario? –

0

In realtà, un po 'di esercizio i sistemi supportano questo; di solito è chiamato "fat binary".

In particolare, Mac OS lo utilizza (utilizzato) per supportare PowerPC e x86 in un binario.

In MS Windows, tuttavia, questo non è possibile in quanto il sistema operativo non lo supporta.

+0

Windows conserva la compatibilità ABI da circa 20 anni. Non c'è molto bisogno di file binari grassi (anche se sono grassi che mirano solo all'unica piattaforma). Windows funziona anche su x86 e amici. –

+0

@Matt: beh, secondo Wikipedia Windows NT utilizzato per funzionare su PowerPC, DEC Alpha e MIPS R4000. E al giorno d'oggi ci sono x86 e x86-64, dove i binari grassi potrebbero essere di aiuto. – sleske

0

Il trucco per fare ciò è creare un binario che abbia istruzioni sulla macchina che verranno emulate in una macchina virtuale sui sistemi operativi e sui processori che si desidera supportare.

Le macchine virtuali più diffuse sono le varianti della macchina virtuale Java. Quindi il mio suggerimento sarebbe quello di guardare un compilatore che compiles C code to Java byte code.

Inoltre, Windows una volta veniva trattato x86 as a virtual machine su altre architetture (Alpha).

0

Windows può eseguire file eseguibili a 32 bit in modalità 64 bit senza problemi. Quindi il tuo exe sarà portatile se lo compili in modalità 32 bit. Oppure devi rilasciare 2 versioni del tuo eseguibile. Se usi Java o C# (o qualsiasi linguaggio compilato da bytecode), il JIT/interprete può ottimizzare il tuo codice per la modalità corrente del SO, quindi è completamente portatile. Ma su C++, dato che produce codice nativo, temo che questo non possa essere fatto se non usando 2 versioni del tuo binario.

0

Per riassumere le altre risposte, se si vuole creare un unico file eseguibile che può essere caricato ed eseguito su più piattaforme, che, fondamentalmente, sono due opzioni:

  1. creare un "grasso binario" , che contiene il codice macchina per più piattaforme. Questo non è normalmente supportato dalla maggior parte degli strumenti di sviluppo e potrebbe richiedere caricatori speciali sulla piattaforma di destinazione;

  2. Compilare a un codice byte per JVM o per .Net. Ho sentito parlare di un compilatore C che genera codice byte Java (non ricordo il nome in modo casuale), ma non l'ha mai usato, né ho alcuna idea di quale sarebbe la qualità dell'implementazione.

Normalmente, la procedura per supportare più piattaforme in C è quello di generare differenti eseguibili per ciascun bersaglio, utilizzando un compilatore croce o eseguendo un compilatore su ciascuna piattaforma. Ciò richiede di riflettere su come scrivere e organizzare il codice sorgente in modo che i bit specifici della piattaforma possano essere facilmente sostituiti senza influire sulla logica generale del programma, per gradi variabili di "facilità".

0

La risposta breve è che non si può, la risposta lunga è che ci sono diverse opzioni.

  1. Fat Binary. Il rovescio della medaglia è che questo richiede il supporto del sistema operativo. L'unico SO a livello di utente che conosco che supporti è OS X per il loro power pc alla migrazione di Intel.
  2. Traduzione in croce. Come usato da Transmeta e Apple. Di nuovo nessun fornitore di soluzioni generali che io conosca.
  3. un interprete C \ C++. Ce n'è almeno uno che sono a conoscenza di Ch. Funziona su Windows, Linux, OS X. Nota Ch non è completamente compatibile con C++.
1

Non confondere le piattaforme del processore con le piattaforme del sistema operativo. per piattaforme OS diverse, i file binari della macchina sono completamente diversi. anche non è possibile creare un programma di istruzioni one-to-one. è evidente che l'intera architettura dell'insieme di istruzioni può essere diversa e che i diversi gruppi di istruzioni possono avere un formato di istruzioni totalmente diverso, e anche alcune istruzioni potrebbero mancare o una piattaforma di destinazione. Solo un emulatore o macchina virtuale può farlo.

0

A questa domanda piace chiedere "C'è un modo per viaggiare dal Canada in un'altra città del mondo?"

E la risposta è: "sì, c'è".

per la compilazione di un codice sorgente C/C++ in un file eseguibile su piattaforma Windows senza alcuna macchina virtuale è possibile utilizzare Windows Legacy API o MFC (specialmente con l'uso di MFC in una libreria statica in Dll). Questo file eseguibile funziona approssimativamente su tutti i PC che dispongono di Windows, poiché Windows viene eseguito su sole 3 piattaforme (x86, x64, IA64, eccetto Windows 8 & 8.1 che supporta ARM). Naturalmente è necessario compilare il codice sorgente per i codici x86 su 32 bit e piattaforme x86-64 e Itaniums possono eseguire il tuo exe in emulazione. Ma su tutti i processori che eseguono Windows come sistema operativo (come ARMS nei dispositivi mobili) dovresti compilarlo per Windows Phone o Windows CE.

-1

è possibile scrivere un mid-library ~ come ad esempio:

 [ Library ] 

    [ mid-library] 

[linux part] [windows part] 

allora, si può usare biblioteca, la vostra applicazione sarà portatile ~~