Pregunta ¿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.


533
2018-04-21 09:16


origen


Respuestas:


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

Sobre Cygwin

El propósito de Cygwin es hacer que las aplicaciones basadas en portar * nix a Windows sean mucho más sencillas, al emular muchos de los pequeños detalles que proporcionan los sistemas operativos basados ​​en Unix, y están documentadas por el POSIX estándares. Si su aplicación asume que puede usar la característica de Unix, como las tuberías, el acceso al directorio y al archivo de estilo Unix, etc., puede compilarlo en Cygwin y Cygwin mismo actuará como un capa de compatibilidad alrededor de su aplicación, por lo 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 compilar algo para Cygwin y distribuir esa aplicación resultante, también debe distribuir el entorno de tiempo de ejecución Cygwin (proporcionado por cygwin1.dll) junto con eso, 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 compilador de GNU, como GCC, Make, Bash, etc. No intenta emular ni proporcionar una compatibilidad completa con Unix, sino que proporciona el entorno mínimo necesario para usar GCC (el compilador 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 programarse 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 compilado en MinGW's GCC se compilará en un destino nativo de Windows X86, incluidos los archivos .exe y .dll, aunque también se puede compilar de forma cruzada con la configuración correcta. MinGW es una alternativa de código abierto para Microsoft Visual C ++ compilador y sus herramientas asociadas de vinculación / creación.

Existen marcos de plataformas multiplataforma considerablemente sofisticados que facilitan la tarea de portar aplicaciones a varios sistemas operativos, por ejemplo, Qt framework 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.


502
2018-04-27 03:15



Cygwin es un intento 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 eso no obliga a un trabajo derivado a ser cubierto por la GPLv3 +. MinGW es un conjunto de compiladores 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, compilado con MinGW llamado MSYS. No tiene en ningún lado todas las características de Cygwin, pero es ideal para programadores que quieran usar MinGW.


297
2018-04-21 09:21



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


134
2018-04-27 06:28



Wikipedia hace una comparación aquí.

De Cygwin's sitio web:

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

De Mingw sitio web:

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 programas nativos de Windows que no dependen de ninguna DLL de tiempo de ejecución de C de terceros.


59
2018-04-21 09:21



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


42
2018-04-21 09:20



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


Pregunta n. ° 1: Deseo 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 n. ° 1: escriba su código fuente en   JAVA. Compila el código fuente una vez y   ejecutarlo 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 (por ejemplo, Windows, Linux y Mac OS X ...).

Respuesta # 2: Escribe tu código fuente en C   o C ++. Use archivos de encabezado estándar   solamente. Use 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 ningún   funciones avanzadas de programación para   compila tu código fuente en todos   plataformas con éxito. Si utiliza   ninguna clase estándar C o C ++ o   funciones, su código fuente no   compilar en otras plataformas.


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

Respuesta # 3: Sí, use el compilador GCC. Eso   es un compilador multiplataforma. A   compila tu código fuente en Windows   utilizar MinGW que proporciona el compilador de GCC   para Windows y compila tu fuente   código al programa nativo de Windows. No haga   utilizar cualquier característica de programación avanzada   (como la API de Windows) para compilar su   código fuente en todas las plataformas   exitosamente. Si usas la API de Windows   funciones, su código fuente no   compilar en otras plataformas.


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

Respuesta # 4: Deberías usar POSIX   (Interfaz de sistema operativo portátil   [para UNIX]) estándar. Proporciona muchos   características avanzadas de programación y   herramientas. Muchos sistemas operativos completamente o   parcialmente compatible con POSIX (como Mac OS)   X, Solaris, BSD / OS y ...). Algunos   sistemas operativos, aunque no oficialmente   certificado como POSIX compatible, conformado   en gran parte (como Linux, FreeBSD,   OpenSolaris y ...). Cygwin proporciona   un desarrollo en gran medida compatible con POSIX   y entorno de tiempo de ejecución para Microsoft   Windows.


Así:

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

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


38
2018-04-01 00:06



Wikipedia dice:

MinGW bifurcado de la versión 1.3.3 de Cygwin. Aunque ambos Cygwin   y MinGW se puede usar para virar UNIX software para Windows, ellos   tener diferentes enfoques: Cygwin tiene como objetivo proporcionar una completa POSIX layer    que proporciona emulaciones de varias llamadas al sistema y bibliotecas   que existe en Linux, UNIX, y el BSD variantes. los POSIX layer   se ejecuta en la parte superior de Windows, sacrificando el rendimiento donde   necesario para la compatibilidad. En consecuencia, este enfoque requiere    Windows programas escritos con Cygwin para ejecutar en la parte superior de un copylefted   biblioteca de compatibilidad que se debe distribuir con el programa, junto con   con el programa source code. MinGW tiene como objetivo proporcionar nativo   funcionalidad y rendimiento a través de directo Windows API calls. diferente a    Cygwin, MinGW no requiere una capa de compatibilidad DLL y   por lo tanto, los programas no necesitan ser distribuidos con source code.

Porque MinGW depende de Windows API calls, no puede   proporcionar un completo POSIX API; no puede compilar UNIX applications que se puede compilar con Cygwin. Específicamente, esto   se aplica a las aplicaciones que requieren POSIX funcionalidad como    fork(), mmap() o ioctl() y aquellos que esperan ser ejecutados en una    POSIX environment. Aplicaciones escritas usando un cross-platform library eso mismo ha sido portado a MinGW, como SDL,    wxWidgets, Qt, o GTK+, por lo general se compilará tan fácilmente en    MinGW como lo harían en Cygwin.

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

También es posible cross-compile Windows applications con    MinGW-GCC under POSIX systems. Esto significa que los desarrolladores no   necesita una instalación de Windows con MSYS para compilar software que   ejecutarse en Windows sin Cygwin.


23
2017-07-06 18:48



Desde el punto de vista de portar un programa C, una buena forma 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 stat a _stat, podemos compilar este programa con Microsoft Visual C. También podemos compilar este programa con MinGW y con Cygwin.

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

En MinGW, el programa estará vinculado a msvcrt.dll, que es una biblioteca interna, no documentada, no versionada que es parte de Windows y está fuera 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 programa tendrá comportamientos similares:

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

También podemos compilar el programa bajo Cygwin. Al igual que en el 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 propiamente dicho) y cyggcc_s-1.dll (Soporte de tiempo de ejecución de GCC). Como Cygwin ahora está bajo LGPL, podemos empacar con nuestro programa, incluso si no es un software libre compatible con GPL, y enviar el programa.

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

  • el stat función tiene una funcionalidad rica, devolviendo valores significativos en la mayoría de los campos.
  • el camino c:file.txt no se entiende en absoluto como una referencia de letra de unidad, ya que c: no es seguido por 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.
  • el system función intenta usar el /bin/sh -c Interprete. Cygwin resolverá la / ruta de acuerdo con la ubicación de su ejecutable, y esperar un sh.exe programa que se ubicará junto con su ejecutable.

Tanto Cygwin como MinGW le permiten usar las funciones de Win32. Si quieres llamar MessageBox o CreateProcess, usted puede hacer eso. También puede crear fácilmente un programa que no requiere una ventana de consola, utilizando 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 la redistribuible msvcrtnn.dll tiempos de ejecución). Un ejemplo de esto es el spawn* familia de funciones como spawnvp. Estas son una buena idea para usar en lugar de fork y execen 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 programas de Cygwin no son menos "nativos" que los programas de MS Visual C porque requieren el acompañamiento de las bibliotecas. Se espera que las implementaciones del lenguaje de programació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 programas GPL-ed se pueden compilar 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 de lejos el entorno superior para portar programas 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 que el cursor funcione bien en el cmd.exe ventana. 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 algunas rutas codificadas como /bin/sh y otros problemas. Estas diferencias son las que hacen que los programas de Cygwin sean "no nativos". Si un programa 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 programas de Windows. Si no funciona de esa manera, es un problema.

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

Cuando Cygnal resuelva el problema del manejo de rutas, será posible desarrollar un único ejecutable que funcione con las rutas de Windows cuando se envíe como una aplicación de Windows con Cygnal, y que funcione perfectamente con las rutas de Cygwin cuando se instale en su computadora. /usr/bin bajo Cygwin. Con Cygwin, el ejecutable funcionará de forma transparente con una ruta como /cygdrive/c/Users/bob. En el despliegue nativo en el que se vincula con la versión Cygnal de cygwin1.dll, ese camino no tendrá sentido, mientras que entenderá c:foo.txt.


17
2018-04-27 02:15