2010-11-10 23 views
13

Estoy usando Cygwin y tengo instalado GCC (versión 4.3.4 20090804 (versión) 1) como paquete de Cygwin.Archivo ejecutable generado usando GCC bajo cygwin

Cuando construí el código C usando GCC bajo Cygwin shell, el archivo de salida ejecutable generado es un ejecutable de tipo (ejecutable PE32 para MS Windows (consola) Intel 80386 de 32 bits) y solo se puede ejecutar/ejecutar bajo Cygwin shell, no como .exe independiente en Windows shell/símbolo del sistema. Si trato de ejecutarlo de forma independiente en el símbolo del sistema de Windows, aparece una ventana de error que dice "El programa no puede ejecutarse porque falta cygwin.dll en su computadora".

  1. ¿Cómo se puede hacer de este .exe independiente, que se puede ejecutar en un símbolo del sistema de cualquier otro sistema o incluso en mi propio sistema?

  2. Pensé que GCC bajo Cygwin construiría un ejecutable de Linux (ELF de 32 bits ejecutable LSB), pero no es así. ¿Cómo puedo usar la combinación gcc-cygwin para generar un tipo * .out de archivo ejecutable de Linux?

  3. Además, no puedo ejecutar un ejecutable Linux generado en una combinación Linux-gcc para ejecutarlo bajo Cygwin.

Cualquier puntero sería útil.

Respuesta

12

A pesar de los rumores generalizados, Cygwin no es un emulador de Linux, es decir, no produce ni ejecuta ejecutables de Linux. Para eso, necesitarás una máquina virtual o coLinux.

En cambio, Cygwin es una capa de compatibilidad, que tiene como objetivo implementar la mayor cantidad posible de las API de POSIX y Linux dentro de Windows. Esto significa que los programas deben compilarse específicamente para Cygwin, pero también significa que está mejor integrado con Windows, p. te permite mezclar API POSIX y Windows en el mismo programa.

Es el cygwin1.dll que proporciona esa capa de compatibilidad. Si construyes ejecutables que no son de Cygwin usando el modificador gnc-3 -mno-cygwin o uno de los compiladores MinGW, entonces por supuesto no puedes utilizar ninguna API específica de POSIX/Linux, y cualquier llamada de ese tipo deberá ser reemplazada por Windows equivalentes.

+0

Por lo tanto, a partir de su respuesta, entiendo que Cygwin solo proporciona las API POSIX para algunas llamadas a funciones, por lo que el mismo código se puede ejecutar en windws sin cambios en el código. Pero a qué se llama esa 'cosa/componente', que permite a un compilador (gcc) generar un ejecutable específico de Linux. En otras palabras, ¿puede un compilador gcc en el sistema linux generar un ejecutable de Windows que se puede ejecutar en el sistema Windows, dando algunas opciones a gcc? – goldenmean

+0

La construcción de un ejecutable de Windows en Linux requiere un compilador cruzado. En otras palabras, necesita invocar un compilador diferente; las opciones no funcionarán Algunas distribuciones de Linux tienen paquetes MinGW, por lo que el gcc real se llama i686-pc-mingw32-gcc o algo así. Pero nuevamente, si su programa usa funciones POSIX/Linux, no podrá construirlo con un compilador MinGW sin cambios. También existen compiladores cruzados para construir programas Cygwin en Linux, pero no creo que ninguna distribución se envíe con uno. – ak2

2

Necesita tener cygwin.dll en su camino.

O simplemente use MinGW para compilar el código nativo de Windows sin dependencias.

+0

@leppie: Entendido, gracias. Entonces para que el exe se haga independiente de cygwin & Para ser ejecutado en algún otro sistema de Windows que no tenga cygwin instalado, necesito usar MingW. ¿Es MingW un compilador o algún tipo de biblioteca en la que mi código debería vincularse? – goldenmean

+0

@goldenmean: Puede probar la opción del compilador '-mno-cygwin', pero leí en alguna parte que se eliminó de las versiones más nuevas de Cygwin. – leppie

+0

@Leppie: Sí, la opción de gcc parece haber desaparecido. Cuando traté de usarla, me dio "gcc: se eliminó el indicador -mno-cygwin; use un compilador cruzado dirigido por mingw". Gracias. Entonces ahora necesito usar el compilador MingW en cygwin en lugar de gcc, ¿o sí? – goldenmean

4

No es una respuesta completa, pero creo que puedo dar algunos consejos.

1) http://www.cygwin.com/cygwin-ug-net/programming.html dice que debe usar el parámetro -mswindows. Eche un vistazo a MinGW.

2) Necesita una cruz gcc para hacer esto. Por defecto, cygwin gcc produce binarios enlazados contra cygwin.dll.

3) Que sea porque es un binario de Linux. La forma más fácil es recompilar el software en cygwin.

14

Cygwin es una capa de emulación. Permite que el código de UNIX se ejecute en Windows, si lo compila para usar la capa de emulación. Para Windows se parece a cualquier DLL normal y hace que las llamadas al sistema operativo sean normales. Pero cuando compila en su contra, muestra las mismas funciones que UNIX (bueno, POSIX es técnicamente, pero es UNIX)

1) Cuando compila con cygwin, automáticamente trae este cygwin1.dll. Este es el código que necesita para que se vea como UNIX.Hay indicadores para que no use este cygwin dll, lo que significa ignorar las cosas de UNIX y usar llamadas nativas de Windows. la bandera -mno-cygwin hará que el binario sea un binario nativo de Windows, sin usar la emulación cygwin. Como han dicho otros, también necesita el -mwindows para crear aplicaciones de GUI reales utilizando cygwin gcc.

2) Para compilar en una plataforma para ejecutar en otra plataforma, necesita lo que se denomina compilador cruzado. También necesita las bibliotecas y encabezados para el otro sistema. Para lo que quieras, necesitarás un compilador cruzado cygwin-Linux, encabezados y bibliotecas de Linux. Probablemente sea mucho más fácil ejecutar Linux en una máquina virtual que configurarlo.

3) Recuerde que Cygwin simplemente se parece al código UNIX a UNIX source, no a los binarios de Linux. Una vez que compila las cosas, las llamadas de función son llamadas a la DLL de Windows. Un programa cygwin sigue siendo un programa de Windows (por lo que necesita una DLL de estilo de Windows para ejecutarlo). Cygwin proporciona código para funciones UNIX/llamadas al sistema tales como fork(), pero incluso el método para llamarlas ahora es diferente. fork() ahora llama a una DLL de Windows, no a un kernel de Linux. Sigue siendo un sistema muy diferente.

+0

Gracias por respuestas precisas y claras. Comprendido un buen trato de ellos. – goldenmean

4

ad 1) En este momento hay tres compiladores cruzados diferente MinGW disponibles para cygwin:
El viejo gcc3 -mno-cygwin es obsoleto.
Hay nuevos compiladores cruzados mingw64 para 32 bits (mingw64-i686-gcc) y objetivos de Windows de 64 bits (mingw64-x86_64-gcc).
No hay ningún mingw-i686-gcc que coincida con el compilador oficial de cygwin gcc4.

ad 2) No existe un compilador cruzado de linux como el paquete cygwin disponible. Pero las personas informan sobre el éxito construyendo un compilador cruzado por sí mismos.

ad 3) No hay un compilador cruzado cygwin como paquete de Linux disponible, pero muchos compiladores cruzados de mingw. Esos ejecutables de mingw también se pueden ejecutar bajo cygwin, aunque no pueden usar las características de cygwin, solo el tiempo de ejecución simple de Windows.

Corrección de errores en los mensajes gente otros:
-mswindows no es válida, -mwindows le indica al enlazador para generar una aplicación GUI, sin consola.
-mno-cygwin solo es válido para el antiguo compilador gcc3 en desuso y ya no se admite. No lo uses Con cygwin deberías usar el host ordinario y el objetivo triples como con cualquier otro compilador cruzado.

Cuestiones relacionadas