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

658

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.

Łukasz Lew
fuente

Respuestas:

629

Como simplificación, es así:

  • Compila algo en Cygwin y lo estás compilando para Cygwin .

  • Compila algo en MinGW y lo estás compilando para Windows .

Sobre Cygwin

El propósito de Cygwin es facilitar mucho más la transferencia de aplicaciones basadas en Unix a Windows, emulando muchos de los pequeños detalles que proporcionan los sistemas operativos basados ​​en Unix, y que están documentados por los estándares POSIX . Su aplicación puede usar la función de Unix, como tuberías, acceso a archivos y directorios al estilo de Unix, etc., y se puede compilar con Cygwin, que actuará como una capa de compatibilidad alrededor de su aplicación, de modo que muchos de esos paradigmas específicos de Unix puedan seguir siendo utilizado.

Cuando distribuye su software, el destinatario deberá ejecutarlo junto con el entorno de tiempo de ejecución de Cygwin (proporcionado por el archivo cygwin1.dll). Puede distribuir esto con su software, pero su software deberá cumplir con su licencia de código abierto. Incluso puede darse el caso de que incluso vincular su software con él, pero distribuir el dll por separado, aún así requiera que honre la licencia de código abierto.

Sobre MinGW

MinGW pretende ser simplemente un puerto de Windows de las herramientas del compilador GNU, como GCC, Make, Bash, etc. No intenta emular ni proporcionar compatibilidad completa con Unix, sino que proporciona el entorno mínimo necesario para usar GCC (el compilador GNU) y una pequeña cantidad de otras herramientas en Windows. No tiene una capa de emulación Unix como Cygwin, pero como resultado, su aplicación necesita ser programada 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 estándar de Unix y utiliza características específicas de Unix como las mencionadas anteriormente. De manera predeterminada, el código compilado en el GCC de MinGW se compilará en un objetivo nativo de Windows X86, incluidos los archivos .exe y .dll, aunque también podría realizar una compilación cruzada con la configuración correcta, ya que básicamente está utilizando el conjunto de herramientas del compilador GNU.

MinGW es esencialmente una alternativa al compilador de Microsoft Visual C ++ y sus herramientas de vinculación / creación asociadas. Puede ser posible en algunos casos usar MinGW para compilar algo que fue diseñado para compilar con Microsoft Visual C ++, con las bibliotecas correctas y en algunos casos con otras modificaciones.

MinGW incluye algunas bibliotecas estándar básicas para interactuar con el sistema operativo Windows, pero al igual que con las bibliotecas estándar normales incluidas en la colección del compilador GNU, estas no imponen restricciones de licencia en el software que ha creado.

Para las aplicaciones de software no triviales, hacerlas multiplataforma puede ser un desafío considerable a menos que use un marco integral multiplataforma. En el momento en que escribí esto, el marco Qt era uno de los más populares para este propósito, ya que permitía la creación de aplicaciones gráficas que funcionan en sistemas operativos, incluido Windows, pero también hay otras opciones. Si utiliza dicho marco desde el principio, no solo puede reducir sus dolores de cabeza cuando llega el momento de migrar a otra plataforma, sino que puede usar los mismos widgets gráficos (ventanas, menús y controles) en todas las plataformas si está escribiendo un GUI y haga que aparezcan nativas para el usuario.

thomasrutter
fuente
43
El bash que viene con MinGW no es un programa nativo de Windows. Depende de la DLL de MSYS, que es una bifurcación de la DLL de Cygwin. Lo mismo para muchas de las otras utilidades de Unix que vienen con MinGW / MSYS. Sin embargo, MinGW gcc es un programa nativo. Make está disponible tanto en una versión nativa como en una MSYS.
ak2
66
alguna diferencia en términos de velocidad?
EKanadily
66
La diferencia de velocidad será ignorable en la mayoría de las situaciones. Cualquier diferencia se reducirá a cuánto disminuye el nivel adicional de abstracción proporcionado por la capa de compatibilidad cygwin. Puede tener un efecto medible en cosas como E / S. Por ejemplo, hace mucho tiempo, Git solo se ejecutaba en Windows en cygwin, y por eso fue un poco más lento. Por otra parte, si codifica utilizando un marco, también es una capa de abstracción con el potencial de ralentizar algunas cosas de todos modos.
thomasrutter
28
Debo señalar que el código compilado para cygwin sigue siendo código nativo , no necesita ejecutarse a través de un intérprete como, por ejemplo, Java. Es solo que cuando necesita interactuar con ciertas características del sistema operativo como disco / archivo, pasa a través de otra capa.
thomasrutter
44
En general, no podría comparar, porque tiene que escribir su código de manera diferente dependiendo de si es para cygwin o no. Aunque para cualquier software pequeño y simple como "hello world", el equivalente de cygwin será más grande solo debido a la biblioteca de tiempo de ejecución de cygwin. Si no cuenta el tamaño de la biblioteca de tiempo de ejecución de cygwin, la versión de cygwin generalmente será más pequeña, pero creo que es una cifra falsa, ya que la biblioteca prácticamente siempre tendrá que ser suministrada con el software. Dicho esto, si está utilizando bibliotecas / marcos no triviales, entonces dependerá más de eso.
thomasrutter
311

Cygwin es un intento de crear un entorno UNIX / POSIX completo en Windows. Para hacer esto, utiliza varias DLL. Si bien estas DLL están cubiertas por GPLv3 +, su licencia contiene una excepción que no obliga a que GPLv3 + cubra un trabajo derivado. MinGW es un conjunto de compiladores de C / C ++ que le permite crear ejecutables de Windows sin depender de tales 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 pequeño entorno similar a UNIX / POSIX, compilado con MinGW llamado MSYS . No tiene cerca de todas las características de Cygwin, pero es ideal para programadores que desean usar MinGW.

Cole Johnson
fuente
59
¿Pero si quiero lanzar software gratuito que no sea GPL? Lo siento, no soy fanático de la GPL, eso es todo.
19
@Dan No necesita redistribuir el tiempo de ejecución que usa MinGW, es parte de Windows.
14
@ ak2: eso es cierto, pero engañoso. El entorno cygwyn gcc + cygwin se predetermina a la producción de binarios vinculados a la (GPL) cygwin dll. mingw + msys por defecto produce binarios vinculados a la plataforma C lib.
Sean McMillan
44
@DanMoulding Si no eres fanático de Microsoft, tendrás que ignorar esos sentimientos para desarrollar Windows en primer lugar. ;-)
Arda Xi
14
@anon "Pero si quiero lanzar software gratuito que no sea GPL?". Cygwin tiene una excepción especial en sus términos de licencia que le permite distribuir software gratuito vinculado con él bajo otras licencias de código abierto (no GPL). Consulte "Excepción de licencia de código abierto" aquí: cygwin.com/licensing.html
steve cook
138

Para agregar a las otras respuestas, Cygwin viene con las bibliotecas y encabezados de MinGW y puede compilar sin vincular a cygwin1.dll utilizando el indicador -mno-cygwin con gcc. Prefiero esto en lugar de usar MinGW y MSYS.

TrayMan
fuente
31
Esto ya no funciona con cygwin 1.7.6. gcc: se ha eliminado la bandera -mno-cygwin; use un compilador cruzado dirigido a mingw.
sigjuice
2
@sigjuice: cierto, pero la antigua bandera -mno-cygwin todavía funciona para GCC 3.x:gcc-3 -mno-cygwin
Amro
1
Entonces, ¿esto significa que necesito descargar las bibliotecas mingw del sitio oficial de mingw para compilar en un destino mingw desde un host cygwin? ¿O se pueden descargar estas bibliotecas del sistema de paquetes de Cygwin?
CMCDragonkai
55
@CMCDragonkai Puede adquirir compiladores compatibles con mingw desde el sitio de Cygwin ejecutando la utilidad de configuración y localizándolos y seleccionándolos. Entonces, aunque gcc ya no genera código compatible con mingw, puede ejecutar dentro de Cygwin un "mingw-gcc" (ese no es el nombre completo) para hacer el mismo tipo de ejecutable que el compilador mingw haría en msys.
Cardiff Space Man
99
Para modificar la útil respuesta de Cardiff, los paquetes y comandos MinGW de Cygwin tienen nombres algo oscuros. Para instalar MinGW-64 (más o menos lo que siempre quiere en estos días ), instale el mingw64-x86_64-gcc-corepaquete Cygwin. MinGW-64 estará disponible como el x86_64-w64-mingw32-gcccomando con un nombre extraño . Por favor Dios (s), alguien ya unifique los nombres de estas cosas sangrientas.
Cecil Curry
60

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 de API de Linux que proporciona una funcionalidad sustancial de API de Linux.
  • Una colección de herramientas que proporcionan la apariencia de Linux.

Desde el sitio web de Mingw :

MinGW ("Minimalistic GNU for Windows") es una colección de archivos de encabezado específicos de Windows disponibles libremente y distribuibles y bibliotecas de importación combinadas con conjuntos de herramientas GNU que le permiten a uno producir programas nativos de Windows que no se basan en archivos DLL de tiempo de ejecución de C de terceros.

Dirkgently
fuente
47

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 compila a una aplicación nativa de Win32.

Si crea algo con Cygwin, cualquier sistema en el que lo instale también necesitará las DLL de Cygwin. Una aplicación MinGW no necesita ningún tiempo de ejecución especial.

Michael Burr
fuente
42

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, compilarlo una vez y ejecutarlo en cualquier plataforma (por ejemplo, Windows, Linux y Mac OS X ...).

Respuesta # 1: Escribe tu código fuente en JAVA. Compile el código fuente una vez y ejecútelo en cualquier lugar.


Pregunta n. ° 2: Quiero crear una aplicación que escriba el código fuente una vez, pero no hay ningún problema en que compile el código fuente para cualquier plataforma por separado (por ejemplo, Windows, Linux y Mac OS X ...).

Respuesta # 2: Escribe tu código fuente en C o C ++. Utilice solo archivos de encabezado estándar. Utilice un compilador adecuado para cualquier plataforma (por ejemplo, Visual Studio para Windows, GCC para Linux y XCode para Mac). Tenga en cuenta que no debe usar ninguna función de programación avanzada para compilar su código fuente en todas las plataformas con éxito. Si no utiliza ninguna clase o función estándar de C o C ++, su código fuente no se compila en otras plataformas.


Pregunta # 3: En respuesta a la pregunta # 2, es difícil usar un compilador diferente para cada plataforma, ¿hay algún compilador multiplataforma?

Respuesta # 3: Sí, use el compilador GCC. Es un compilador multiplataforma. Para compilar su código fuente en Windows use MinGW que proporciona el compilador GCC para Windows y compila su código fuente al programa nativo de Windows. No use ninguna función de programación avanzada (como la API de Windows) para compilar su código fuente en todas las plataformas con éxito. Si usa las funciones de la API de Windows, su código fuente no se compila en otras plataformas.


Pregunta n. ° 4: Los archivos de encabezado estándar C o C ++ no proporcionan ninguna función de programación avanzada, como subprocesos múltiples. ¿Que puedo hacer?

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


Así:

Para usar la ventaja del compilador multiplataforma GCC en Windows, use MinGW.

Para aprovechar la ventaja de las características y herramientas de programación avanzada estándar de POSIX en Windows, use Cygwin.

Amir Saniyan
fuente
44
Acerca de su pequeño faq: 1) Su derecho, si necesita algo que se ejecuta en cualquier lugar y no necesita compilarse, elija algo como java (tampoco olvide Python, Perl, Ruby y el resto de los lenguajes de script) 2) Esto es algo incorrecto para el caso de C, ya que todos los compiladores de C lo admiten muy bien. 3) Todavía puede usar la API de win32, pero debe envolverla en una capa de portabilidad, por lo que eso es solo un problema de diseño.
Coyote21
1
4) Esto es totalmente incorrecto, debido a las razones que menciono anteriormente, ya que POSIX es solo otra api, también si defiende tanto POSIX, debe saber que incluso Unices no necesita implementar el mismo conjunto de POSIX, entonces cómo ¿lidias con eso? El tiempo real POSIX api viene a la mente. Y eso hace que su conclusión sea completamente falsa e incorrecta, ya que no necesita POSIX para nada en Windows, solo puede usar la API Win32. ¿O cómo crees que Qt, GTK y WxWidgets han encontrado una manera de ser multiplataforma, supongo que todos tienen que usar Cygwin en Windows? -1 voto por tu respuesta.
Coyote21
44
No entiendo tu argumento, @ Coyote21. ¿Estás diciendo que POSIX no es adecuado para el desarrollo multiplataforma? ¿Está diciendo que la única forma adecuada de escribir código en C / C ++ para múltiples plataformas es escribir su propia capa de compatibilidad para cada plataforma que desea admitir? No veo nada malo con la sugerencia de comenzar con POSIX. Es necesario ver hasta dónde puede llegar y si se requerirá una amplia solución de capa de compatibilidad. Las grandes capas de compatibilidad no son la norma. Decir lo contrario es argumentar que POSIX es un completo fracaso.
David Gladfelter
El subprocesamiento múltiple se implementa a través de la capa POSIX incluso en MinGW.
Alexander Shishenko
1
"No debe utilizar ninguna función de programación avanzada para compilar su código fuente en todas las plataformas con éxito". Realmente necesita aclarar lo que quiere decir con "funciones de programación avanzadas". Según una línea posterior, supongo que en realidad se refiere a características específicas de la plataforma . Si se refería a las características del lenguaje moderno, entonces no, porque existen compiladores competentes para "todas las plataformas [principales]", y no deberíamos privarnos de las características solo para apuntalar a aquellos cuyos compiladores o bibliotecas aún están rezagados. Con un compilador decente, C / ++ estándar y bibliotecas multiplataforma, podemos estar bastante avanzados.
underscore_d
34

Desde el punto de vista de portar un programa en C, una buena manera de entender esto es tomar un ejemplo:

#include <sys/stat.h>
#include <stdlib.h>

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

Si cambiamos stata_stat , podemos compilar este programa con Microsoft Visual C. También podemos compilar este programa con MinGW y con Cygwin.

Bajo Microsoft Visual C, el programa estará vinculado a una biblioteca de tiempo de ejecución redistribuible de MSVC: mxvcrtnn.dlldonde nnhay algún sufijo de versión. Para enviar este programa tendremos que incluir esa DLL. Esa DLL proporciona _stat, systemyprintf . (También tenemos la opción de vincular estáticamente el tiempo de ejecución).

Bajo MinGW, el programa estará vinculado a msvcrt.dll , que es una biblioteca interna, indocumentada, no versionada que forma parte de Windows y está prohibida para el uso de aplicaciones. Esa biblioteca es esencialmente una bifurcación de la biblioteca redistribuible de tiempo de ejecución de MS Visual C para su uso por el propio Windows.

Bajo estos dos, el programa tendrá comportamientos similares:

  • la statfunción devolverá información muy limitada, por ejemplo, sin permisos útiles o números de inodo.
  • la ruta c:file.txtse resuelve de acuerdo con el directorio de trabajo actual asociado con la unidad c:.
  • systemutiliza cmd.exe /cpara ejecutar el comando externo.

También podemos compilar el programa bajo Cygwin. De manera similar al tiempo de ejecución redistribuible utilizado por MS Visual C, el programa Cygwin estará vinculado a las bibliotecas de tiempo de ejecución de Cygwin:cygwin1.dll Cygwin (Cygwin propiamente dicho) y cyggcc_s-1.dll(soporte de tiempo de ejecución GCC). Dado que Cygwin está ahora bajo la LGPL, podemos empaquetar con nuestro programa, incluso si no es un software gratuito compatible con GPL, y enviar el programa.

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

  • la stat función tiene una rica funcionalidad, que devuelve valores significativos en la mayoría de los campos.
  • c:file.txtno se entiende que la ruta contenga una referencia de letra de unidad, ya quec: que no va seguida de una barra inclinada. El colon se considera parte del nombre y de alguna manera se destrozó. No hay un concepto de una ruta relativa contra un volumen o unidad en Cygwin, no hay un concepto de "unidad actualmente registrada" y no hay un directorio de trabajo actual por unidad.
  • la systemfunción intenta usar el /bin/sh -cintérprete. Cygwin resolverá la /ruta de acuerdo con la ubicación de su ejecutable y esperará que un sh.exeprograma se ubique junto con su ejecutable.

Tanto Cygwin como MinGW le permiten usar las funciones de Win32. Si quiere llamar MessageBoxo CreateProcesspuede hacerlo. También puede crear fácilmente un programa que no requiera una ventana de consola, utilizando gcc -mwindowsMinGW 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.dlllos msvcrtnn.dlltiempos de ejecución redistribuibles ). Un ejemplo de esto son la spawn*familia de funciones como spawnvp. Es una buena idea usar en lugar de forky execen Cygwin, ya que se asignan mejor al modelo de creación de procesos de Windows que no tiene ningún concepto fork.

Así:

  • Los programas de Cygwin no son menos "nativos" que los programas de MS Visual C porque requieren el acompañamiento de bibliotecas. Se espera que las implementaciones de lenguaje de programación en Windows proporcionen su propio tiempo de ejecución, incluso implementaciones de lenguaje C. No hay "libc" en Windows para uso público.

  • El hecho de que MinGW no requiera una 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 se aplica la excepción de la biblioteca del sistema GPL msvcrt.dll, lo que significa que los programas GPL-ed pueden compilarse y redistribuirse con MinGW.

  • Debido a su soporte mucho más amplio y profundo para POSIX en comparación msvcrt.dll, Cygwin es, con mucho, el entorno superior para portar programas POSIX. Dado que ahora está bajo la LGPL, permite redistribuir aplicaciones con todo tipo de licencias, de código abierto o cerrado. ¡Cygwin incluso contiene la emulación VT100 y termios, que funcionan con la consola de Microsoft! Una aplicación POSIX que configura el modo sin procesar tcsetattry utiliza códigos VT100 para controlar el cursor funcionará directamente en la cmd.exeventana. En lo que respecta al usuario final, es una aplicación de consola nativa que hace llamadas a Win32 para controlar la consola.

Sin embargo:

  • Como herramienta de desarrollo nativa de Windows, Cygwin tiene algunas peculiaridades, como el manejo de rutas ajenas a Windows, la dependencia de algunas rutas codificadas /bin/shy otros problemas. Estas diferencias son las que hacen que los programas Cygwin sean "no nativos". Si un programa toma una ruta como argumento, o ingresa desde un cuadro de diálogo, los usuarios de Windows esperan que esa ruta funcione de la misma manera que lo hace en otros programas de Windows. Si no funciona de esa manera, eso es un problema.

Enchufe: Poco después del anuncio de LGPL, comencé el proyecto Cygnal (Cygwin Native Application Library) para proporcionar una bifurcación de la DLL de Cygwin que tiene como objetivo solucionar estos problemas. Los programas se pueden desarrollar bajo Cygwin y luego implementarse con la versión de Cygnal cygwin1.dllsin recompilar. A medida que esta biblioteca mejore, eliminará gradualmente la necesidad de MinGW.

Cuando Cygnal resuelva el problema de manejo de ruta, será posible desarrollar un único ejecutable que funcione con rutas de Windows cuando se envíe como una aplicación de Windows con Cygnal, y que funcione perfectamente con rutas de Cygwin cuando esté instalado en su /usr/binCygwin. Bajo 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 de Cygnal cygwin1.dll, esa ruta no tendrá sentido, mientras que lo entenderá c:foo.txt.

Kaz
fuente
2
Excelente respuesta Mostrar lo que sucede cuando se compila, vincula y ejecuta el mismo fragmento de código en cada uno de los 3 entornos es clave y aclara las diferencias.
drlolly
@Kaz ¿Cómo va ese desarrollo? Suena interesante pero parece muerto desde hace al menos un año. ¿Por qué no usas GitHub para que las personas puedan ayudar y participar?
not2qubit
2
@ not2qubit Siento que tengo un mejor control sobre mis proyectos cuando están alojados en mi propio servidor que yo mismo controlo. Estoy usando git; El repositorio se puede extraer. Puedo aceptar solicitudes de extracción por correo electrónico (como las diseñó Linus Torvalds). También puedo dar una cuenta con privilegios de compromiso a alguien que se convierte en un contribuidor a nivel de mantenedor. Cygnal funciona bien; Regularmente lo incluyo en las versiones de Windows de las nuevas versiones del lenguaje TXR. Replantearé Cygnal a una línea de base más nueva de Cygwin en algún momento a principios de 2019.
Kaz
@ not2qubit Tenga en cuenta que las 17 cuestiones en la agenda de Cygnal son las que se abordan. Nadie ha sugerido nuevos requisitos ni se ha quejado de la forma en que se manejan esos 17. Por lo tanto, no se requiere un desarrollo que no sea volver a crear el nuevo Cygwin, que no es muy urgente.
Kaz
27

Wikipedia dice :

MinGWbifurcado de la versión 1.3.3 de Cygwin. Aunque ambos Cygwin y MinGWse puede utilizar para el puerto UNIXde software para Windows, tienen diferentes enfoques: Cygwinpretende ofrecer una completa POSIX layer que proporciona emulaciones de varias llamadas al sistema y bibliotecas que existen en Linux, UNIXy las BSDvariantes. Se POSIX layer ejecuta encima de Windows, sacrificando el rendimiento donde sea necesario para la compatibilidad. En consecuencia, este enfoque requiere que los Windowsprogramas escritos se Cygwinejecuten sobre una biblioteca de compatibilidad con copyleft que se debe distribuir junto con el programa source code. MinGWtiene como objetivo proporcionar una funcionalidad nativa y un rendimiento directo Windows API calls. diferente a Cygwin ,MinGWno requiere una capa de compatibilidad DLLy, por lo tanto, no es necesario distribuir los programas con source code.

Porque MinGWdepende de Windows API calls, no puede proporcionar un completo POSIX API; no puede compilar algunos con los UNIX applicationsque se pueda compilar Cygwin. Específicamente, esto se aplica a aplicaciones que requieren POSIXfuncionalidades como fork(), mmap()o ioctl()y aquellas que esperan ejecutarse en a POSIX environment. Las aplicaciones escritas usando una cross-platform libraryque ha sido portado a sí misma MinGW, como SDL, wxWidgets, Qt, o GTK+, por lo general se compile con la misma facilidad en MinGWque lo harían en Cygwin.

La combinación de MinGWy MSYSproporciona un entorno pequeño y autónomo que se puede cargar en medios extraíbles sin dejar entradas en el registro o archivos en la computadora. CygwinPortable ofrece una característica similar. Al proporcionar más funcionalidad, se Cygwin vuelve más complicado de instalar y mantener.

También es posible cross-compile Windows applicationscon MinGW-GCC under POSIX systems. Esto significa que los desarrolladores no necesitan una instalación de Windows con MSYSpara compilar el software que se ejecutará Windowssin él Cygwin.

PersianGulf
fuente
2
¡Definitivamente no es "más complicado de instalar y mantener" ! Úselo apt-cygya que quizás sea aún más fácil que usar apt en WSL.
not2qubit
14

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

Como 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.

Norman Ramsey
fuente
44
Wow, esas son algunas páginas web malas. Finalmente pude encontrar un enlace de descarga en www2.research.att.com/sw/download , pero no había documentación o información en línea sobre el proyecto.
Fantius
1
Si bien la información es útil, creo que esta podría ser la respuesta a una pregunta sobre alternativas para MingW o Cygwin en lugar de esta pregunta.
Vivek
12

Otras respuestas ya dieron en el blanco. Solo quiero agregar una ilustración para una captura rápida.

ingrese la descripción de la imagen aquí

smwikipedia
fuente
11

Cygwin emula todo el entorno POSIX, mientras que MinGW es un conjunto mínimo de herramientas para compilación únicamente (compila la aplicación Win nativa). Entonces, si desea hacer que su proyecto multiplataforma, la elección entre los dos 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 hacen eso (por ejemplo, Firefox o Python).

vartec
fuente
"La mayoría" parece una palabra de comadreja sin sentido aquí, especialmente con solo 2 ejemplos y sin estadísticas. Muchos proyectos de FOSS incluyen un archivo de proyecto VS como un gesto simbólico, sospecho que es más preciso. Pero si la experiencia pasada es algo para pasar, GCC o Clang son generalmente más seguros ya que VS tiende a retrasarse considerablemente a medida que evolucionan los estándares del lenguaje.
underscore_d
Esa es una respuesta de 2009. Hoy en día las cosas se ven aún más sombrías para GCC. En cuanto a "la mayoría", si mide por impacto, solo Firefox y Chrome solo tienen más usuarios que cualquier otra cosa.
vartec
2
Lo que ha cambiado desde que respondí es que ahora clanges una solución viable multiplataforma.
vartec
9

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

Por ejemplo, Cygwin tar puede bifurcar, porque fork () es compatible con la DLL, donde la versión mingw no puede. Este es un problema al intentar compilar mysql desde la fuente.


fuente
Esta es la razón por la cual los entornos totalmente habilitados para MinGW, por ejemplo, MSYS2, ofrecen un Cygwin u otra capa totalmente compatible con POSIX para las tuercas y tornillos de bajo nivel de las cadenas de herramientas necesarias durante la construcción. Luego, la compilación y la vinculación reales se dejan al compilador MinGW totalmente nativo. MSYS2 es realmente ordenado.
underscore_d
9

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 licencia cygwin" y ver los primeros resultados.

Para mingw, no se incurre en dicho costo y las licencias (PD, BSD, MIT) son extremadamente permisivas. A lo sumo se puede espera que suministrar detalles de la licencia con su aplicación, como se requiere licencia los winpthreads cuando se utiliza 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 distribuye bajo la LGPL, a diferencia de la GPL completa.

Ingeniero
fuente
2
Una actualización del sitio web de Redhat (el enlace de "compra de licencia" - 'A partir del 1 de marzo de 2016, Red Hat ya no vende la licencia de compra comercial para Cygwin. La licencia comercial ya no es necesaria porque Cygwin ahora se distribuye bajo GNU Lesser GPL (LGPL). '> Desde el sitio web de Cygwin. La biblioteca API Cygwin ™ que se encuentra en el subdirectorio winsup del código fuente está cubierta por la Licencia 3 de GNU Lesser General Public License (LGPL). Para detalles de los requisitos de LGPLv3, lea la Licencia pública general menor de GNU (LGPL).
Izzy Helianthus
6

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 similar a Linux completa. En comparación, MinGW y MSYS proporcionan una capa ligera y minimalista similar a POSIX, con solo las herramientas más esenciales como gccy bashdisponibles. Debido al enfoque más minimalista de MinGW, no proporciona el grado de cobertura API POSIX que ofrece Cygwin y, por lo tanto, no puede construir ciertos programas que de otro modo podrían compilarse en Cygwin.

En términos del código generado por los dos, la cadena de herramientas Cygwin se basa en enlaces dinámicos a una gran biblioteca de tiempo de ejecución cygwin1.dll, mientras que la cadena de herramientas MinGW compila el código en binarios que se vinculan dinámicamente a la biblioteca C nativa de Windows msvcrt.dll, así como 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 binarios de MinGW pueden enviarse de forma independiente, pero tienden a ser más grandes.

El hecho de que los programas basados ​​en Cygwin requieran una DLL separada para ejecutarse también conlleva restricciones de licencia. La biblioteca de tiempo de ejecución de 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 crear 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 las bibliotecas tienen licencia permisiva.

bwDraco
fuente
3

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

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

Puede ejecutar binarios generados mingwsin el cygwinentorno, siempre que estén presentes todas las bibliotecas necesarias (DLL).

gimel
fuente
1

Cygwinusa una capa de compatibilidad, mientras que MinGWes nativa. Esa es una de las principales diferencias.

usuario3362761
fuente