windows - para - mingw portable
¿Cuál es la diferencia entre Cygwin y MinGW? (15)
Quiero que mi proyecto de 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?
Cygwin emula todo el entorno POSIX, mientras que MinGW es un conjunto de herramientas mínimo para compilación solamente (compila la aplicación Win nativa). Por lo tanto, si desea que su proyecto sea multiplataforma, la elección entre los dos es obvia, MinGW.
Aunque podría considerar el uso de VS en Windows, GCC en Linux / Unices. La mayoría de los proyectos de código abierto hacen eso (por ejemplo, Firefox o Python).
Cygwin es un intento de crear un entorno completo UNIX / POSIX en Windows. Para ello utiliza varios archivos DLL. Si bien estos archivos DLL están cubiertos por GPLv3 +, su licencia contiene una excepción que no obliga a que un trabajo derivado sea cubierto por la GPLv3 +. MinGW es un conjunto de compiladores 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 en ninguna parte cerca de todas las características de Cygwin, pero es ideal para los programadores que desean usar MinGW.
Cygwin está diseñado para proporcionar un entorno POSIX más o menos completo para Windows, incluido un extenso conjunto de herramientas diseñadas para proporcionar una plataforma similar a Linux. En comparación, MinGW y MSYS proporcionan una capa ligera, 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 POSIX API que ofrece Cygwin y, por lo tanto, no puede crear ciertos programas que de otro modo pueden compilarse en Cygwin.
En términos del código generado por los dos, el conjunto de herramientas de Cygwin se basa en un enlace dinámico a una gran biblioteca en tiempo de ejecución, cygwin1.dll
, mientras que el conjunto de herramientas de MinGW compila código a 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 se pueden enviar 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 conduce a restricciones de licencia. La biblioteca de ejecución de Cygwin está licenciada 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 en torno a Cygwin deben adquirir una licencia comercial de Red Hat. Por otro lado, el código de MinGW se puede utilizar tanto en aplicaciones de código abierto como de código cerrado, ya que los encabezados y las bibliotecas tienen licencias permisivas.
Cygwin usa 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 creas algo con Cygwin, cualquier sistema en el que lo instales también necesitará los DLL de Cygwin. Una aplicación MinGW no necesita ningún tiempo de ejecución especial.
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 se vinculará a una biblioteca de tiempo de ejecución redistribuible de mxvcrtnn.dll
: mxvcrtnn.dll
, donde nn
es el sufijo de alguna versión. Para enviar este programa tendremos que incluir esa DLL. Esa DLL proporciona _stat
, system
y printf
.
Bajo MinGW, el programa se vinculará a msvcrt.dll
, que es una biblioteca interna, no documentada y no versionada que forma parte de Windows y está fuera del alcance 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 uso de Windows.
Bajo ambos de estos, el programa tendrá comportamientos similares:
- La función de
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 unidadc:
-
system
usacmd.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 se vinculará a las bibliotecas de tiempo de cygwin1.dll
Cygwin: cygwin1.dll
(Cygwin propiamente dicho) y cyggcc_s-1.dll
(soporte de tiempo de ejecución de GCC). Dado que Cygwin ahora está bajo la licencia LGPL, podemos empaquetarlo con nuestro programa, incluso si no es software libre compatible con GPL, y enviar el programa.
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 que contiene una referencia de letra de unidad, ya quec:
no es seguida por una barra. Los dos puntos se consideran parte del nombre y de alguna manera se mutilan en él. No existe el 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 utilizar el intérprete/bin/sh -c
. Cygwin resolverá la ruta/
según la ubicación de su ejecutable, y esperará que un programash.exe
junto con su ejecutable.
Tanto Cygwin como MinGW te permiten usar las funciones de Win32. Si desea llamar a MessageBox
o CreateProcess
, puede hacerlo. También puede crear fácilmente un programa 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 re-distribuibles de msvcrtnn.dll
). Un ejemplo de esto son la familia de funciones spawn*
como spawnvp
. Estos son una buena idea de 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 concepto de fork
.
Así:
Los programas de Cygwin no son menos "nativos" que los programas de MS Visual C, ya que requieren el acompañamiento de las bibliotecas. Se espera que las implementaciones de lenguaje de programación en Windows proporcionen sus propias implementaciones en tiempo de ejecución, incluso en lenguaje C. No hay "libc" en Windows para uso público.
El hecho de que MinGW no requiera DLL de terceros es realmente una desventaja; depende de una bifurcación interna de Windows no documentada 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 soporte mucho más amplio y profundo para POSIX en comparación con
msvcrt.dll
, Cygwin es, con mucho, el entorno superior para portar programas POSIX. Dado que ahora está bajo la LGPL, permite que las aplicaciones con todo tipo de licencias, de código abierto o cerrado, se redistribuyan. Cygwin incluso contiene emulación VT100 ytermios
, que funcionan con la consola de Microsoft. Una aplicación POSIX que configura el modo sintcsetattr
contcsetattr
y utiliza códigos VT100 para controlar el cursor funcionará directamente en la ventana decmd.exe
. En lo que respecta al usuario final, es una aplicación de consola nativa que realiza 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 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 entrada de 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 así, eso es un problema.
Enchufe: Poco después del anuncio de LGPL, comencé el proyecto Cygnal (Biblioteca de aplicaciones nativas de Cygwin) para proporcionar una bifurcación de la DLL de Cygwin que apunta a solucionar estos problemas. Los programas pueden desarrollarse bajo Cygwin y luego implementarse con la versión cygwin1.dll
de cygwin1.dll
sin recompilar. A medida que esta biblioteca mejore, gradualmente eliminará la necesidad de MinGW.
Cuando Cygnal resuelva el problema de manejo de la ruta, 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 sin problemas con las rutas de Cygwin cuando se instale en su /usr/bin
bajo Cygwin. Bajo Cygwin, el ejecutable trabajará 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 entenderá c:foo.txt
.
Lea estas preguntas respondidas para comprender la diferencia entre Cygwin y MinGW.
Pregunta # 1: Quiero crear una aplicación en la que escribo el código fuente una vez, lo compilo una vez y lo ejecuto en cualquier plataforma (por ejemplo, Windows, Linux y Mac OS X ...).
Respuesta # 1: Escriba su código fuente en JAVA. Compile el código fuente una vez y ejecútelo en cualquier lugar.
Pregunta # 2: Quiero crear una aplicación en la que escribo 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: Escriba su código fuente en C o C ++. Utilice únicamente 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 clases o funciones estándar 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í, usar 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 en el programa nativo de Windows. No utilice 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 # 4: los archivos de encabezado estándar de C o C ++ no proporcionan ninguna función de programación avanzada como multihilo. ¿Que puedo hacer?
Respuesta # 4: Debe usar el estándar POSIX (Interfaz del sistema operativo portátil [para UNIX]). Proporciona muchas funciones y herramientas de programación avanzadas. Muchos sistemas operativos son total o parcialmente compatibles con POSIX (como Mac OS X, Solaris, BSD / OS y ...). Algunos sistemas operativos, aunque no están oficialmente certificados 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 aprovechar las ventajas del compilador multiplataforma GCC en Windows, use MinGW.
Para aprovechar las ventajas de las funciones y herramientas de programación avanzada estándar de POSIX en Windows, use Cygwin.
No pase por alto el software U/Win AT&T , que está diseñado para ayudarlo a compilar aplicaciones Unix en Windows (última versión - 2012-08-06; usa la licencia pública de Eclipse, versión 1.0).
Como Cygwin, tienen que correr contra una biblioteca; En su caso POSIX.DLL
. Los chicos de AT&T son ingenieros estupendos (el mismo grupo que te trajo ksh y dot ) y vale la pena echarles un vistazo.
Para agregar a las otras respuestas, Cygwin viene con las cabeceras y las bibliotecas de MinGW y puede compilar sin vincular a cygwin1.dll utilizando el indicador -mno-cygwin con gcc. Yo prefiero esto a usar simple MinGW y MSYS.
Para usar Cygwin en una aplicación comercial / propietaria / no de código abierto, tendrá que 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 primeros resultados.
Para mingw, no se incurre en tal costo, y las licencias (PD, BSD, MIT) son extremadamente permisivas. Como máximo, se espera que proporcione los detalles de la licencia con su aplicación, como la licencia winpthreads requerida 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 está distribuyendo bajo la LGPL, a diferencia de la GPL completa.
Tenga en cuenta que el comportamiento de la utilidad realmente puede variar entre los dos.
Por ejemplo, Cygwin tar puede bifurcar, porque fork () es compatible con la DLL, donde la versión mingw no puede. Esto es un problema al intentar compilar mysql desde la fuente.
Wikipedia hace una comparación here .
Desde el website 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 la API de Linux que proporciona una funcionalidad sustancial de la API de Linux.
- Una colección de herramientas que proporcionan la apariencia de Linux.
Desde el website de Mingw:
MinGW ("GNU minimalista para Windows") es una colección de archivos de encabezado específicos de Windows de libre distribución y distribución libre combinados con conjuntos de herramientas GNU que permiten producir programas nativos de Windows que no dependen de ningún DLL de tiempo de ejecución de C de terceros.
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) a Microsoft Windows, junto con un conjunto de bibliotecas de importación y archivos de encabezado de libre distribución para la API de Windows. MinGW permite a los desarrolladores crear aplicaciones nativas de Microsoft Windows.
Puede ejecutar los binarios generados con mingw
sin el entorno cygwin
, siempre que estén presentes todas las bibliotecas (DLL) necesarias.
Cygwin
usa una capa de compatibilidad, mientras que MinGW
es nativo. Esa es una de las principales diferencias.
MinGW
bifurcado de la versión 1.3.3 deCygwin
. Aunque tantoCygwin
comoMinGW
se pueden usar para portar el softwareUNIX
aWindows
, tienen diferentes enfoques:Cygwin
pretende proporcionar unaPOSIX layer
completa que proporcione emulaciones de varias llamadas de sistema y bibliotecas que existen enLinux
,UNIX
y las variantesBSD
. LaPOSIX layer
ejecuta sobreWindows
, sacrificando el rendimiento cuando sea necesario para la compatibilidad. En consecuencia, este enfoque requiere queWindows
programas deWindows
escritos conCygwin
ejecuten sobre una biblioteca de compatibilidad con copyleft que debe distribuirse con el programa, junto con elsource code
del programa.MinGW
tiene como objetivo proporcionar funcionalidad y rendimiento nativos a través deWindows API calls
directas deWindows API calls
. A diferencia deCygwin
,MinGW
no requiere unDLL
capa de compatibilidad y, por lo tanto, los programas no necesitan ser distribuidos consource code
.Debido a que
MinGW
depende deWindows API calls
, no puede proporcionar unaPOSIX API
completa; no puede compilar algunasUNIX applications
que se pueden compilar conCygwin
. Específicamente, esto se aplica a aplicaciones que requieren la funcionalidadPOSIX
comofork()
,mmap()
oioctl()
y aquellas que esperan ejecutarse en unPOSIX environment
. Las aplicaciones escritas utilizando unacross-platform library
que se ha portado aMinGW
, comoSDL
,wxWidgets
,Qt
oGTK+
, generalmente se compilan tan fácilmente enMinGW
como 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 proporciona una característica similar. Al proporcionar más funcionalidad,Cygwin
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 software que se ejecutará enWindows
sinCygwin
.
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 .
Acerca de Cygwin
El propósito de Cygwin es hacer que las aplicaciones basadas en Unix a Windows sean mucho más fáciles, al emular muchos de los pequeños detalles que proporcionan los sistemas operativos basados en Unix y están documentados por los estándares POSIX . Su aplicación puede usar la característica Unix, como tuberías, archivos de estilo Unix y acceso a directorios, etc., y puede compilarse 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 pueden continuar siendo utilizado.
Cuando distribuya 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 tendrá que cumplir con su licencia de código abierto. Incluso puede darse el caso de que incluso simplemente vinculando su software con él, pero la distribución de la DLL por separado, aún requiera que respete la licencia de código abierto.
Acerca de MinGW
MinGW pretende ser simplemente un puerto de Windows de las herramientas del compilador 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 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 debe estar programada específicamente para poder ejecutarse en Windows, lo que puede significar una alteración significativa si se creó para confiar en que se ejecute en un entorno estándar de Unix. utiliza características específicas de Unix como las mencionadas anteriormente. De manera predeterminada, el código compilado en GCC de MinGW se compilará en un destino nativo de Windows X86, incluidos los archivos .exe y .dll, aunque también puede compilarse de forma cruzada con la configuración correcta, ya que básicamente está utilizando el conjunto de herramientas de compilación de GNU.
MinGW es esencialmente una alternativa al compilador de Microsoft Visual C ++ y sus herramientas de vinculación / creación asociadas. En algunos casos, puede ser posible usar MinGW para compilar algo destinado a compilar con Microsoft Visual C ++, con las bibliotecas adecuadas 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 de compiladores GNU, estas no imponen restricciones de licencia en el software que ha creado.
Para aplicaciones de software no triviales, hacerlas multiplataforma puede ser un desafío considerable a menos que use un marco integral multiplataforma. Cuando 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 funcionaban en todos los sistemas operativos, incluido Windows, pero también hay otras opciones. Si usa un marco de este tipo desde el principio, no solo puede reducir sus dolores de cabeza cuando llega el momento de trasladarse 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 de GUI, y hacer que aparezcan nativos para el usuario.