¿Cuál es la diferencia entre Cygwin y MinGW?

Quiero hacer que mi proyecto C ++ sea multiplataforma, y ​​estoy considerando usar Cygwin / MinGW. Pero, ¿cuál es la diferencia entre ellos?

Otra pregunta es si podré ejecutar el binario en un sistema sin Cygwin / MinGW.

Como una simplificación, es así:

  • Comstack algo en Cygwin y lo estás comstackndo para Cygwin .

  • Comstack algo en MinGW y lo estás comstackndo para Windows .

Sobre Cygwin

El objective de Cygwin es simplificar las aplicaciones de portar * nix a Windows, emulando muchos de los pequeños detalles que proporcionan los sistemas operativos basados ​​en Unix, y están documentados por los estándares POSIX . Si su aplicación asume que puede usar características de Unix como tuberías, acceso al directorio y archivos de estilo Unix, etc., puede comstackrlo en Cygwin y Cygwin mismo actuará como una capa de compatibilidad alrededor de su aplicación, de modo que muchos de estos paradigmas específicos de Unix pueden continuar usándose con poca o ninguna modificación en su aplicación.

Si desea comstackr algo para Cygwin y distribuir esa aplicación resultante, también debe distribuir el entorno de tiempo de ejecución Cygwin (provisto por cygwin1.dll ) junto con él, y esto tiene implicaciones para los tipos de licencia de software que puede usar .

Acerca de MinGW

MinGW es un puerto de Windows de las herramientas del comstackdor de GNU, como GCC, Make, Bash, etc. No intenta emular o proporcionar una compatibilidad completa con Unix, sino que proporciona el entorno mínimo necesario para usar GCC (el comstackdor de GNU) y un pequeño número de otras herramientas en Windows . No tiene una capa de emulación Unix como Cygwin, pero como resultado, su aplicación debe progtwigrse específicamente para poder ejecutarse en Windows, lo que puede significar una alteración significativa si se creó para confiar en que se ejecuta en un entorno Unix estándar y usa características específicas de Unix como las mencionadas anteriormente. De forma predeterminada, el código comstackdo en MinGW’s GCC se comstackrá en un destino nativo de Windows X86, incluidos los archivos .exe y .dll, aunque también se puede comstackr de forma cruzada con la configuración correcta. MinGW es una alternativa de código abierto para el comstackdor de Microsoft Visual C ++ y sus herramientas asociadas de vinculación / creación.

Existen marcos de plataforma multiplataforma considerablemente sofisticados que facilitan la tarea de portar aplicaciones a varios sistemas operativos, por ejemplo, el marco Qt es un marco popular para aplicaciones multiplataforma. Si utiliza dicho framework desde el principio, no solo puede reducir sus dolores de cabeza a la hora de realizar el puerto a otra plataforma, sino que también puede usar los mismos widgets gráficos (ventanas, menús y controles) en todas las plataformas si está escribiendo un Aplicación GUI.

Cygwin es un bash de crear un entorno completo UNIX / POSIX en Windows. Para hacer esto usa varias DLL. Si bien estos archivos DLL están cubiertos por GPLv3 +, su licencia contiene una excepción que no obliga a un trabajo derivado a ser cubierto por la GPLv3 +. MinGW es un conjunto de comstackdores C / C ++ que le permite crear ejecutables de Windows sin depender de dichos archivos DLL; solo necesita los tiempos de ejecución normales de MSVC, que son parte de cualquier instalación normal de Microsoft Windows.

También puede obtener un entorno pequeño UNIX / POSIX, comstackdo con MinGW llamado MSYS . No tiene en ningún lado todas las características de Cygwin, pero es ideal para progtwigdores que quieran usar MinGW.

Para agregar a las otras respuestas, Cygwin viene con las librerías y encabezados de MinGW y usted puede comstackr sin vincular al cygwin1.dll usando el indicador -mno-cygwin con gcc. Prefiero esto a utilizar MinGW y MSYS simples.

Wikipedia hace una comparación aquí .

Desde el sitio web de Cygwin:

  • Cygwin es un entorno similar a Linux para Windows. Consta de dos partes: una DLL (cygwin1.dll) que actúa como una capa de emulación API de Linux que proporciona una funcionalidad sustancial de la API de Linux.
  • Una colección de herramientas que proporcionan apariencia y sensación de Linux.

Desde el sitio web de Mingw:

MinGW (“Minimalistic GNU for Windows”) es una colección de archivos de cabecera específicos de Windows libremente disponibles y distribuibles, y bibliotecas de importación combinadas con juegos de herramientas de GNU que permiten producir progtwigs nativos de Windows que no dependen de ninguna DLL de tiempo de ejecución de C de terceros.

Cygwin utiliza una DLL, cygwin.dll, (o tal vez un conjunto de DLL) para proporcionar un tiempo de ejecución similar a POSIX en Windows.

MinGW comstack a una aplicación Win32 nativa.

Si construyes algo con Cygwin, cualquier sistema en el que lo instales también necesitará la (s) DLL (s) de Cygwin. Una aplicación MinGW no necesita ningún tiempo de ejecución especial.

Lea estas preguntas respondidas para comprender la diferencia entre Cygwin y MinGW.


Pregunta n. ° 1: Quiero crear una aplicación que escriba el código fuente una vez, comstackrlo una vez y ejecutarlo en cualquier plataforma (p. Ej., Windows, Linux y Mac OS X …).

Respuesta # 1: Escriba su código fuente en JAVA. Comstack el código fuente una vez y ejecútalo en cualquier lugar.


Pregunta n. ° 2: Deseo crear una aplicación que escriba el código fuente una vez, pero no hay problema de que compile el código fuente para cualquier plataforma por separado (p. Ej., Windows, Linux y Mac OS X …).

Respuesta n. ° 2: escriba su código fuente en C o C ++. Use solo archivos de encabezado estándar. Utilice un comstackdor adecuado para cualquier plataforma (por ejemplo, Visual Studio para Windows, GCC para Linux y XCode para Mac). Tenga en cuenta que no debe utilizar ninguna característica de progtwigción avanzada para comstackr su código fuente en todas las plataformas con éxito. Si no usa ninguna clase o función estándar C o C ++, su código fuente no se comstack en otras plataformas.


Pregunta n. ° 3: En respuesta a la pregunta n. ° 2, es difícil usar un comstackdor diferente para cada plataforma, ¿existe algún comstackdor multiplataforma?

Respuesta # 3: Sí, use el comstackdor GCC. Es un comstackdor multiplataforma. Para comstackr su código fuente en Windows use MinGW que proporciona el comstackdor GCC para Windows y comstack su código fuente para el progtwig nativo de Windows. No utilice ninguna característica de progtwigción avanzada (como la API de Windows) para comstackr correctamente su código fuente en todas las plataformas. Si usa las funciones de la API de Windows, su código fuente no se comstack en otras plataformas.


Pregunta n. ° 4: los archivos de encabezado estándar C o C ++ no brindan funciones de progtwigción avanzadas, como el multi-threading. ¿Que puedo hacer?

Respuesta n. ° 4: Debe usar el estándar POSIX (interfaz de sistema operativo portátil [para UNIX]). Proporciona muchas características y herramientas avanzadas de progtwigción. Muchos sistemas operativos son totalmente o parcialmente compatibles con POSIX (como Mac OS X, Solaris, BSD / OS y …). Algunos sistemas operativos, aunque no están certificados oficialmente como compatibles con POSIX, se conforman en gran parte (como Linux, FreeBSD, OpenSolaris y …). Cygwin proporciona un entorno de desarrollo y ejecución en gran medida compatible con POSIX para Microsoft Windows.


Así:

Para aprovechar las ventajas del comstackdor multiplataforma de GCC en Windows, use MinGW.

Para aprovechar las ventajas de las funciones y herramientas de progtwigción avanzadas estándar de POSIX en Windows, use Cygwin.

Wikipedia dice :

MinGW bifurcó de la versión 1.3.3 de Cygwin . Aunque Cygwin y MinGW se pueden usar para portar el software UNIX a Windows , tienen diferentes enfoques: Cygwin pretende proporcionar una POSIX layer completa que proporciona emulaciones de varias llamadas al sistema y bibliotecas que existen en Linux , UNIX y las variantes BSD . La POSIX layer ejecuta sobre Windows , sacrificando el rendimiento donde sea necesario para la compatibilidad. En consecuencia, este enfoque requiere que Windows progtwigs de Windows escritos con Cygwin ejecuten sobre una biblioteca de compatibilidad con copyleft que se debe distribuir con el progtwig, junto con el source code del progtwig. MinGW tiene como objective proporcionar funcionalidad y rendimiento nativos a través de Windows API calls directas a la Windows API calls . A diferencia de Cygwin , MinGW no requiere una DLL capa de compatibilidad y, por lo tanto, los progtwigs no necesitan ser distribuidos con el source code .

Como MinGW depende de Windows API calls , no puede proporcionar una POSIX API completa; no puede comstackr algunas UNIX applications que se pueden comstackr con Cygwin . Específicamente, esto se aplica a aplicaciones que requieren funcionalidad POSIX como fork() , mmap() o ioctl() y aquellas que esperan ejecutarse en un POSIX environment . Las aplicaciones escritas usando una cross-platform library que ha sido portada a MinGW , como SDL , wxWidgets , Qt o GTK+ , generalmente comstackrán tan fácilmente en MinGW como lo harían en Cygwin .

La combinación de MinGW y MSYS proporciona un entorno pequeño e independiente que se puede cargar en medios extraíbles sin dejar entradas en el registro o archivos en la computadora. Cygwin Portable proporciona una característica similar. Al proporcionar más funcionalidad, Cygwin vuelve más complicado de instalar y mantener.

También es posible realizar cross-compile Windows applications con MinGW-GCC under POSIX systems . Esto significa que los desarrolladores no necesitan una instalación de Windows con MSYS para comstackr el software que se ejecutará en Windows sin Cygwin .

Desde el punto de vista de portar un progtwig C, una buena forma de entender esto es tomar un ejemplo:

 #include  #include  int main(void) { struct stat stbuf; stat("c:foo.txt", &stbuf); system("command"); printf("Hello, World\n"); return 0; } 

Si cambiamos la stat a _stat , podemos comstackr este progtwig con Microsoft Visual C. También podemos comstackr este progtwig con MinGW y con Cygwin.

En Microsoft Visual C, el progtwig se vinculará a una biblioteca en tiempo de ejecución redistribuible de mxvcrtnn.dll : mxvcrtnn.dll , donde nn es un sufijo de versión. Para enviar este progtwig, tendremos que incluir esa DLL. Esa DLL proporciona _stat , system y printf .

En MinGW, el progtwig se vinculará a msvcrt.dll , que es una biblioteca interna, no documentada y no versionada que es parte de Windows y está fuera de los límites del uso de la aplicación. Esa biblioteca es esencialmente una bifurcación de la biblioteca de tiempo de ejecución redistribuible de MS Visual C para que la use Windows mismo.

Debajo de ambos, el progtwig tendrá comportamientos similares:

  • la función stat devolverá información muy limitada, por ejemplo, sin permisos útiles o número de inodo.
  • la ruta c:file.txt se resuelve de acuerdo con el directorio de trabajo actual asociado con la unidad c:
  • system usa cmd.exe /c para ejecutar el comando externo.

También podemos comstackr el progtwig bajo Cygwin. De forma similar al tiempo de ejecución redistribuible utilizado por MS Visual C, el progtwig Cygwin se vinculará a las bibliotecas de Cygwin en tiempo de ejecución: cygwin1.dll (Cygwin proper) y cyggcc_s-1.dll (soporte de tiempo de ejecución de GCC). Como Cygwin ahora está bajo LGPL, podemos empacar con nuestro progtwig, incluso si no es un software libre compatible con GPL, y enviar el progtwig.

Bajo Cygwin, las funciones de la biblioteca se comportarán de manera diferente:

  • la función stat tiene una funcionalidad rica, devolviendo valores significativos en la mayoría de los campos.
  • la ruta c:file.txt no se entiende en absoluto como una referencia de letra de unidad, ya que c: no está seguida de una barra inclinada. El colon se considera parte del nombre y de alguna manera se destrozó. No existe un concepto de una ruta relativa contra un volumen o unidad en Cygwin, ningún concepto de “unidad actualmente registrada” y ningún directorio de trabajo actual por unidad.
  • la función del system intenta usar el intérprete /bin/sh -c . Cygwin resolverá la ruta / acuerdo con la ubicación de su ejecutable, y espera que un progtwig sh.exe junto con su ejecutable.

Tanto Cygwin como MinGW le permiten usar las funciones de Win32. Si desea llamar a MessageBox o CreateProcess , puede hacerlo. También puede crear fácilmente un progtwig que no requiera una ventana de consola, usando gcc -mwindows , bajo MinGW y Cygwin.

Cygwin no es estrictamente POSIX. Además de proporcionar acceso a la API de Windows, también proporciona sus propias implementaciones de algunas funciones de Microsoft C (cosas que se encuentran en msvcrt.dll o los msvcrtnn.dll ejecución msvcrtnn.dll ). Un ejemplo de esto es la familia de funciones spawn* como spawnvp . Estas son una buena idea para utilizar en lugar de fork y exec en Cygwin ya que se asignan mejor al modelo de creación de procesos de Windows que no tiene ningún concepto de fork .

Así:

  • Los progtwigs de Cygwin no son menos “nativos” que los progtwigs de MS Visual C porque requieren el acompañamiento de las bibliotecas. Se espera que las implementaciones del lenguaje de progtwigción en Windows proporcionen sus propias implementaciones de lenguaje en tiempo de ejecución, incluso C. No hay “libc” en Windows para uso público.

  • El hecho de que MinGW no requiera DLL de terceros es en realidad una desventaja; depende de una bifurcación indocumentada, interna de Windows, del tiempo de ejecución de Visual C. MinGW hace esto porque la excepción de la biblioteca del sistema GPL se aplica a msvcrt.dll , lo que significa que los progtwigs GPL-ed se pueden comstackr y redistribuir con MinGW.

  • Debido a su compatibilidad mucho más amplia y más profunda para POSIX en comparación con msvcrt.dll , Cygwin es, con mucho, el entorno superior para portar progtwigs POSIX. Como ahora está bajo LGPL, permite redistribuir aplicaciones con todo tipo de licencias, de código abierto o cerrado. ¡Cygwin incluso contiene emulación VT100 y termios , que funcionan con la consola de Microsoft! Una aplicación POSIX que configura el modo raw con tcsetattr y usa códigos VT100 para controlar el cursor funcionará directamente en la ventana de cmd.exe . En lo que respecta al usuario final, se trata de una aplicación de consola nativa que hace llamadas de Win32 para controlar la consola.

Sin embargo:

  • Como una herramienta de desarrollo nativa de Windows, Cygwin tiene algunos caprichos, como el manejo de rutas que es ajeno a Windows, la dependencia de algunos caminos codificados como /bin/sh y otros problemas. Estas diferencias son las que hacen que los progtwigs de Cygwin sean “no nativos”. Si un progtwig toma una ruta como argumento o una entrada desde un cuadro de diálogo, los usuarios de Windows esperan que esa ruta funcione de la misma manera que en otros progtwigs de Windows. Si no funciona de esa manera, es un problema.

Enchufe: Poco después del anuncio LGPL, comencé el proyecto Cygnal (Biblioteca de aplicaciones nativas de Cygwin) para proporcionar un fork del DLL de Cygwin que tiene como objective solucionar estos problemas. Los progtwigs pueden desarrollarse bajo Cygwin y luego desplegarse con la versión cygwin1.dll de cygwin1.dll sin cygwin1.dll comstackr. A medida que esta biblioteca mejore, eliminará gradualmente la necesidad de MinGW.

Cuando Cygnal solucione el problema de la gestión de rutas, será posible desarrollar un solo ejecutable que funcione con las rutas de Windows cuando se envíe como una aplicación de Windows con Cygnal, y funcionará perfectamente con las rutas de Cygwin cuando se instale en su /usr/bin bajo Cygwin. Con Cygwin, el ejecutable funcionará de forma transparente con una ruta como /cygdrive/c/Users/bob . En la implementación nativa donde se vincula con la versión Cygnal de cygwin1.dll , esa ruta no tendrá sentido, mientras que comprenderá c:foo.txt .

No pase por alto el software U / Win de AT & T , que está diseñado para ayudarlo a comstackr aplicaciones Unix en Windows (última versión: 2012-08-06; utiliza la licencia pública de Eclipse, versión 1.0).

Al igual que Cygwin, tienen que correr contra una biblioteca; en su caso POSIX.DLL . Los chicos de AT & T son excelentes ingenieros (el mismo grupo que te trajo ksh y dot ) y vale la pena echarle un vistazo a sus cosas.

Cygwin emula todo el entorno POSIX, mientras que MinGW es un conjunto mínimo de herramientas para comstackción (comstack la aplicación Win nativa). Por lo tanto, si desea hacer que su proyecto sea multiplataforma, la elección entre ambas es obvia, MinGW.

Aunque podría considerar usar VS en Windows, GCC en Linux / Unices. La mayoría de los proyectos de código abierto lo hacen (por ejemplo, Firefox o Python).

Para usar Cygwin en una aplicación comercial / patentada / no de código abierto, deberá desembolsar decenas de miles de dólares para una ” compra de licencia ” de Red Hat; esto invalida los términos de licencia estándar a un costo considerable. Google “costo de la licencia cygwin” y vea los primeros resultados.

Para mingw, no se incurre en tal costo, y las licencias (PD, BSD, MIT) son extremadamente permisivas. A lo sumo, se espera que proporcione detalles de licencia con su aplicación, como la licencia winpthreads requerida al usar mingw64-tdm.

EDITAR gracias a Izzy Helianthus: la licencia comercial ya no está disponible o no es necesaria porque la biblioteca API que se encuentra en el subdirectorio winsup de Cygwin ahora se está distribuyendo bajo LGPL, a diferencia de la GPL completa.

Tenga en cuenta que el comportamiento de la utilidad puede variar genuinamente entre los dos.

Por ejemplo, Cygwin tar puede tenedor – porque fork () es compatible con el DLL – donde la versión mingw no puede. Esto es un problema al intentar comstackr mysql desde la fuente.

Cygwin está diseñado para proporcionar un entorno POSIX más o menos completo para Windows, que incluye un amplio conjunto de herramientas diseñadas para proporcionar una plataforma de estilo Linux completa. En comparación, MinGW y MSYS proporcionan una capa ligera y minimalista tipo POSIX, con solo las herramientas más esenciales como gcc y bash disponibles. Debido al enfoque más minimalista de MinGW, no proporciona el grado de cobertura de la API POSIX que Cygwin ofrece, y por lo tanto no puede construir ciertos progtwigs que de otro modo podrían comstackrse en Cygwin.

En términos del código generado por los dos, Cygwin Toolchain se basa en vincular dinámicamente a una gran biblioteca de tiempo de ejecución, cygwin1.dll , mientras que MinGW toolchain comstack el código en binarios que se vinculan dinámicamente con la biblioteca C nativa de Windows, msvcrt.dll y estáticamente a partes de glibc . Los ejecutables de Cygwin son, por lo tanto, más compactos pero requieren una DLL redistribuible por separado, mientras que los archivos binarios MinGW se pueden enviar de forma independiente, pero tienden a ser más grandes.

El hecho de que los progtwigs basados ​​en Cygwin requieren una DLL separada para ejecutarse también conduce a restricciones de licencia. La biblioteca de tiempo de ejecución Cygwin tiene licencia bajo GPLv3 con una excepción de enlace para aplicaciones con licencias compatibles con OSI, por lo que los desarrolladores que deseen construir una aplicación de código cerrado alrededor de Cygwin deben adquirir una licencia comercial de Red Hat. Por otro lado, el código MinGW se puede usar tanto en aplicaciones de código abierto como de código cerrado, ya que los encabezados y bibliotecas tienen licencia permisiva.

Cygwin es un entorno tipo Unix y una interfaz de línea de comandos para Microsoft Windows.

Mingw es un puerto de software nativo de la Colección de comstackdores de GNU (GCC) para Microsoft Windows, junto con un conjunto de bibliotecas de importación de distribución libre y archivos de encabezado para la API de Windows. MinGW permite a los desarrolladores crear aplicaciones nativas de Microsoft Windows.

Puede ejecutar binarios generados con mingw sin el entorno cygwin , siempre que estén presentes todas las bibliotecas necesarias (DLL).

Cygwin usa una capa de compatibilidad, mientras que MinGW es nativa. Esa es una de las principales diferencias.