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 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.
fuente
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.
fuente
gcc-3 -mno-cygwin
mingw64-x86_64-gcc-core
paquete Cygwin. MinGW-64 estará disponible como elx86_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 :
Desde el sitio web de Mingw :
fuente
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.
fuente
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 ...).
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 ...).
Pregunta # 3: En respuesta a la pregunta # 2, es difícil usar un compilador diferente para cada plataforma, ¿hay algún compilador multiplataforma?
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?
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.
fuente
Desde el punto de vista de portar un programa en C, una buena manera de entender esto es tomar un ejemplo:
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
dondenn
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 unidadc:
.system
utilizacmd.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) ycyggcc_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 unsh.exe
programa se ubique junto con su ejecutable.Tanto Cygwin como MinGW le permiten usar las funciones de Win32. Si quiere llamar
MessageBox
oCreateProcess
puede hacerlo. También puede crear fácilmente un programa que no requiera una ventana de consola, utilizandogcc -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
losmsvcrtnn.dll
tiempos de ejecución redistribuibles ). Un ejemplo de esto son laspawn*
familia de funciones comospawnvp
. Es una buena idea usar en lugar defork
yexec
en Cygwin, ya que se asignan mejor al modelo de creación de procesos de Windows que no tiene ningún conceptofork
.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 ytermios
, que funcionan con la consola de Microsoft! Una aplicación POSIX que configura el modo sin procesartcsetattr
y utiliza códigos VT100 para controlar el cursor funcionará directamente en lacmd.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 Cygnalcygwin1.dll
, esa ruta no tendrá sentido, mientras que lo entenderác:foo.txt
.fuente
Wikipedia dice :
fuente
apt-cyg
ya que quizás sea aún más fácil que usar apt en WSL.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.fuente
Otras respuestas ya dieron en el blanco. Solo quiero agregar una ilustración para una captura rápida.
fuente
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).
fuente
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.
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.
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 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
ybash
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 Windowsmsvcrt.dll
, así como estáticamente a partes deglibc
. 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.
fuente
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 elcygwin
entorno, siempre que estén presentes todas las bibliotecas necesarias (DLL).fuente
Cygwin
usa una capa de compatibilidad, mientras queMinGW
es nativa. Esa es una de las principales diferencias.fuente