File eseguibile generato utilizzando GCC sotto cygwin

Sto usando Cygwin e ho GCC (versione 4.3.4 20090804 (release) 1) installato come pacchetto Cygwin.

Quando ho creato il codice C utilizzando GCC sotto la shell Cygwin, il file di output eseguibile generato è un eseguibile di tipo (eseguibile PE32 per MS Windows (console) Intel 80386 a 32 bit) e può essere eseguito / eseguito solo con shell Cygwin, non come standalone .exe sulla shell di Windows / prompt dei comandi. Se provo ad eseguirlo autonomamente sul prompt dei comandi di Windows, viene visualizzata una finestra di errore che dice “Il programma non può essere eseguito perché cygwin.dll è mancante dal tuo computer”.

  1. Come si può rendere questo .exe standalone, che può essere eseguito su un prompt di comando di qualsiasi altro sistema o anche nel mio stesso sistema?

  2. Pensavo che GCC con Cygwin avrebbe costruito un eseguibile Linux (eseguibile LSB ELF a 32 bit), ma non è così. Come posso usare la combinazione gcc-cygwin per generare un tipo * .out di file eseguibile di Linux?

  3. Inoltre, non posso eseguire un eseguibile Linux generato su una combinazione Linux-gcc da eseguire con Cygwin.

Qualsiasi suggerimento sarebbe utile.

Nonostante le voci diffuse, Cygwin non è un emulatore di Linux, cioè non produce né esegue eseguibili di Linux. Per questo avrai bisogno di una macchina virtuale o di CoLinux.

Invece, Cygwin è un livello di compatibilità, che mira a implementare il più ansible le API POSIX e Linux all’interno di Windows. Ciò significa che i programmi devono essere compilati appositamente per Cygwin, ma significa anche che è meglio integrato con Windows, ad esempio consente di mixare API POSIX e Windows nello stesso programma.

È il cygwin1.dll che fornisce quel livello di compatibilità. Se si costruiscono eseguibili non Cygwin usando l’opzione -mno-cygwin di gcc-3 o uno dei compilatori MinGW, ovviamente non è ansible utilizzare alcuna API specifica per POSIX / Linux e tali chiamate dovranno essere sostituite con Windows equivalenti.

Cygwin è uno strato di emulazione. Permette al codice UNIX di funzionare su Windows, se lo compili per usare il livello di emulazione. A Windows sembra una normale DLL e rende normali le chiamate al SO. Ma quando lo compili, mostra le stesse funzioni di UNIX (beh, POSIX tecnicamente, ma UNIX lo è)

1) Quando costruisci con cygwin, questo automaticamente porta in questo cygwin1.dll. Questo è il codice necessario per renderlo simile a UNIX. Ci sono delle bandiere per non usare questa cygwin dll, che significa ignorare la roba UNIX e usare le chiamate native di Windows. il -mno-cygwin renderà il binario un binario nativo di Windows, non usando l’emulazione cygwin. Come altri hanno già detto, è necessario anche i -mwindows per creare app GUI reali usando cygwin gcc.

2) Per compilare su una piattaforma per funzionare su un’altra piattaforma, è necessario ciò che viene chiamato cross compiler. Sono inoltre necessarie le librerie e le intestazioni per l’altro sistema. Per quello che vuoi, ti serve un compilatore incrociato cygwin-Linux, intestazioni e librerie Linux. Probabilmente sarebbe molto più semplice eseguire Linux su una macchina virtuale piuttosto che configurarlo.

3) Ricorda che Cygwin assomiglia al codice source UNIX in UNIX, non ai file binari di Linux. Una volta compilate le cose, le chiamate di funzione sono chiamate DLL di Windows. Un programma cygwin è ancora un programma Windows (ecco perché è necessario un DLL di stile Windows per eseguirlo). Cygwin fornisce il codice per le funzioni UNIX / chiamate di sistema come fork (), ma anche il metodo di chiamata è ora diverso. fork () ora chiama in una DLL di Windows, non in un kernel Linux. È ancora un sistema molto diverso.

Non è una risposta completa, ma penso di poter dare alcuni suggerimenti.

1) http://www.cygwin.com/cygwin-ug-net/programming.html dice che dovresti usare il parametro -mswindows. Dai un’occhiata a MinGW .

2) È necessario un cross gcc per farlo. Di default cygwin gcc produce binari collegati a cygwin.dll.

3) Questo perché è un binario linux. Il modo più semplice è ricompilare il software in Cygwin.

annuncio 1) Ci sono attualmente tre diversi cross-compilatori mingw disponibili per cygwin:
Il vecchio gcc3 -mno-cygwin è deprecato.
Sono disponibili nuovi cross-compilers mingw64 per destinazioni a 32 bit ( mingw64-i686-gcc ) e windows a 64 bit ( mingw64-x86_64-gcc ).
Non c’è ancora mingw-i686-gcc che corrisponda al compilatore ufficiale cygwin gcc4.

ad 2) Non esiste un cross-compilatore linux come pacchetto cygwin ancora disponibile. Ma le persone segnalano il successo costruendo da soli un simile compilatore.

annuncio 3) Non esiste un cross-compiler cygwin come pacchetto linux disponibile, ma molti cross-compilatori mingw. Questi eseguibili mingw possono anche essere eseguiti sotto cygwin, sebbene non possano usare le funzionalità di cygwin, solo il semplice runtime di Windows.

Correggere gli errori nei post di altre persone:
-mswindows non è valido, -mwindows dice al linker di generare un’app GUI senza console.
-mno-cygwin è valido solo per il vecchio compilatore gcc3 deprecato e non è più supportato. Non usarlo Con cygwin dovresti usare triple ordinate per host e target come per ogni altro cross-compilatore.

Devi avere cygwin.dll nel tuo percorso.

Oppure usa semplicemente MinGW per compilare il codice Windows nativo senza dipendenze.