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.
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.
Respuestas:
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.
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.
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.
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
paquete Cygwin. MinGW-64 estará disponible como el x86_64-w64-mingw32-gcc
comando con un nombre extraño . Por favor Dios (s), alguien ya unifique los nombres de estas cosas sangrientas.
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.
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.
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í:
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 stat
a_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.dll
donde nn
hay algún sufijo de versión. Para enviar este programa tendremos que incluir esa DLL. Esa DLL proporciona _stat
, system
yprintf
. (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:
stat
función devolverá información muy limitada, por ejemplo, sin permisos útiles o números de inodo.c:file.txt
se resuelve de acuerdo con el directorio de trabajo actual asociado con la unidad c:
.system
utiliza cmd.exe /c
para 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:
stat
función tiene una rica funcionalidad, que devuelve valores significativos en la mayoría de los campos.c:file.txt
no 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.system
función intenta usar el /bin/sh -c
intérprete. Cygwin resolverá la /
ruta de acuerdo con la ubicación de su ejecutable y esperará que un sh.exe
programa se ubique junto con su ejecutable.Tanto Cygwin como MinGW le permiten usar las funciones de Win32. Si quiere llamar MessageBox
o CreateProcess
puede hacerlo. También puede crear fácilmente un programa que no requiera una ventana de consola, utilizando gcc -mwindows
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
los msvcrtnn.dll
tiempos de ejecución redistribuibles ). Un ejemplo de esto son la spawn*
familia de funciones como spawnvp
. Es una buena idea usar 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 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 tcsetattr
y utiliza códigos VT100 para controlar el cursor funcionará directamente en la cmd.exe
ventana. 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:
/bin/sh
y 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.dll
sin 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/bin
Cygwin. 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
.
MinGW
bifurcado de la versión 1.3.3 deCygwin
. Aunque ambosCygwin
yMinGW
se puede utilizar para el puertoUNIX
de software paraWindows
, tienen diferentes enfoques:Cygwin
pretende ofrecer una completaPOSIX layer
que proporciona emulaciones de varias llamadas al sistema y bibliotecas que existen enLinux
,UNIX
y lasBSD
variantes. SePOSIX layer
ejecuta encima deWindows
, sacrificando el rendimiento donde sea necesario para la compatibilidad. En consecuencia, este enfoque requiere que losWindows
programas escritos seCygwin
ejecuten sobre una biblioteca de compatibilidad con copyleft que se debe distribuir junto con el programasource code
.MinGW
tiene como objetivo proporcionar una funcionalidad nativa y un rendimiento directoWindows API calls
. diferente aCygwin
,MinGW
no requiere una capa de compatibilidadDLL
y, por lo tanto, no es necesario distribuir los programas consource code
.Porque
MinGW
depende deWindows API calls
, no puede proporcionar un completoPOSIX API
; no puede compilar algunos con losUNIX applications
que se pueda compilarCygwin
. Específicamente, esto se aplica a aplicaciones que requierenPOSIX
funcionalidades comofork()
,mmap()
oioctl()
y aquellas que esperan ejecutarse en aPOSIX environment
. Las aplicaciones escritas usando unacross-platform library
que ha sido portado a sí mismaMinGW
, comoSDL
,wxWidgets
,Qt
, oGTK+
, por lo general se compile con la misma facilidad enMinGW
que lo harían enCygwin
.La combinación de
MinGW
yMSYS
proporciona 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.Cygwin
Portable ofrece una característica similar. Al proporcionar más funcionalidad, seCygwin
vuelve más complicado de instalar y mantener.También es posible
cross-compile Windows applications
conMinGW-GCC under POSIX systems
. Esto significa que los desarrolladores no necesitan una instalación de Windows conMSYS
para compilar el software que se ejecutaráWindows
sin élCygwin
.
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.
Otras respuestas ya dieron en el blanco. Solo quiero agregar una ilustración para una captura rápida.
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).
clang
es una solución viable multiplataforma.
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.
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.
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 gcc
y bash
disponibles. 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.
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 mingw
sin el cygwin
entorno, 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.