windows - full - mingw
¿Por qué GCC-Windows depende de cygwin? (11)
No soy desarrollador de C ++, pero siempre me han interesado los compiladores, y estoy interesado en retocar algunas de las cosas de GCC (particularmente LLVM).
En Windows, GCC requiere una capa de emulación POSIX (cygwin o MinGW) para ejecutarse correctamente.
¿Porqué es eso?
Uso muchos otros softwares, escritos en C ++ y compilados cruzados para diferentes plataformas (Subversion, Firefox, Apache, MySQL), y ninguno de ellos requiere cygwin o MinGW.
Mi comprensión sobre la programación de mejores prácticas en C ++ es que puede escribir un código razonablemente independiente de la plataforma y tratar todas las diferencias durante el proceso de compilación.
Entonces, ¿cuál es el trato con GCC? ¿Por qué no puede ejecutarse de forma nativa en Windows?
EDITAR:
De acuerdo, las dos respuestas hasta ahora dicen, básicamente, "GCC usa la capa posix porque usa los encabezados posix".
Pero eso realmente no responde la pregunta.
Digamos que ya tengo un conjunto de encabezados para mi biblioteca estándar favorita. ¿Por qué todavía necesitaría los encabezados posix?
¿GCC requiere que cygwin / mingw funcione realmente?
¿O solo necesita la capa de emulación para encabezados y bibliotecas? Si es así, ¿por qué no puedo simplemente darle un directorio "lib" con los recursos necesarios?
EDITAR DE NUEVO
De acuerdo, intentaré de nuevo aclarar la pregunta ...
También escribo código en el lenguaje de programación D. El compilador oficial se llama "dmd" y existen binarios oficiales del compilador tanto para Windows como para Linux.
La versión de Windows no requiere ningún tipo de emulación POSIX. Y la versión de Linux no requiere ningún tipo de emulación de Win32. Si el compilador tiene suposiciones sobre su entorno, oculta bastante bien esas suposiciones.
Por supuesto, tengo que decirle al compilador dónde encontrar la biblioteca estándar y dónde encontrar bibliotecas para enlazar de forma estática o dinámica.
GCC, por el contrario, insiste en pretender que está operando en un entorno posix, y me pide que haga un guiño a esas suposiciones configurando una capa de emulación.
¿Pero qué, exactamente, dentro de GCC se basa en esa capa? ¿Simplemente busca los encabezados stdlib y asume que encontrará esos encabezados dentro de "/ usr / lib"?
Si ese es el caso, ¿no debería ser capaz de decirle que busque en "C: / gcc / lib" para encontrar esos archivos de encabezado?
¿O es que GCC confía en las bibliotecas POSIX para acceder al sistema de archivos (y para hacer otras cosas de bajo nivel)? Si ese es el caso, me pregunto por qué no se vinculan de forma estática con sus bibliotecas Windows favoritas de Windows. ¿Por qué requieren que el usuario configure las dependencias, cuando podrían construir esas dependencias directamente en la aplicación?
No soy desarrollador de C ++, pero siempre me han interesado los compiladores, y estoy interesado en retocar algunas de las cosas de GCC (particularmente LLVM)
Tenga en cuenta que LLVM y GCC no están relacionados. LLVM es en gran parte el resultado de la investigación realizada por Chris Lattner ( http://llvm.org/developers.cgi ) sobre la optimización moderna. Sus documentos están disponibles en http://llvm.org . Hoy en día, está fuertemente patrocinado por Apple. El frontend C / C ++ / Obj-C de GCC se usa para llvm-gcc, que emite código de máquina LLVM (y después de un montón de optimizaciones en llvm, sale un ejecutable final); llvm-gcc es una especie de hack para acoplar un poco de C / C ++ / Obj-C-frontend a LLVM.
Nótese de todos modos que el equipo de LLVM también construye un compilador propio, completo de C / C ++ / Obj-C, llamado clang. Su implementación en C está casi completa, el soporte de C ++ está mejorando cada vez más, pero no sé por qué Obj-C.
Entonces, si alguien dice "compilation llvm", realmente quiere decir llvm-gcc, o clang. LLVM en sí es simplemente la Máquina Virtual de Bajo Nivel, con solo un puñado de instrucciones en el formulario de Asignación Única Estática (aproximadamente 32 instrucciones, una feria), pero un megatón de optimización pasa a tu árbol de sintaxis.
¿Por qué? Porque cuando se creó GCC , Windows 32 bit incluso no había salido ...
Para ser más correcto --- fue desarrollado para UNIX / Posix OS. Más tarde fue portado a ventanas.
Windows no es un sistema de compilación POSIX. Incluso no proporciona una funcionalidad muy básica. Intenta encontrar readdir
o stat
en el compilador de Windows? ¡Y esta es una funcionalidad básica tan extrema que necesitas para escribir compiladores!
Para que quede claro, los programas compilados de GCC generalmente requieren solo un mingw32.dll para agregar la funcionalidad faltante para poder ejecutar.
Entonces ... ¿Preguntas por qué GCC requiere algo de capa POSIX? Porque el sistema operativo Windows no es el sistema operativo POSIX.
El puerto MinGW-w64 de gcc crea código nativo para Windows de 32 y 64 bits sin dependencias adicionales. Consulte, por ejemplo, http://mstenberg.com/blog/2010/06/13/gcc-for-windows/ para obtener una guía rápida para comenzar.
En realidad, la premisa de la pregunta es incorrecta: MinGW GCC NO requiere Cygwin.
Verás que no necesitas Cygwin en absoluto. Se ejecuta de forma nativa en Windows (32 bits, al menos). Tanto la cadena de herramientas como los binarios producidos son independientes de Cygwin.
Los compiladores MinGW disponibles en Cygwin son diferentes: se basan en la plataforma Cygwin, para generar código que no depende del tiempo de ejecución de Cygwin. Los compiladores dependen de Cygwin en ese caso. Pero eso es porque los instalaste de Cygwin.
Gran parte de ese software que se compila para diferentes plataformas se compila ... en MinGW. La única diferencia con gcc es que es un compilador en sí mismo , lo que significa que necesita todos los encabezados que normalmente se compilan con el programa, y normalmente uno no necesita ejecutar el programa resultante.
Intento que mis programas en Windows se comporten como un buen ciudadano de Windows y en Linux como un buen ciudadano de Linux.
La versión de Cygwin de GCC requiere que Cygwin esté instalado, para los programas que compila.
La versión MinGW no requiere nada después de la compilación, que no sea una copia de trabajo de Windows.
Realmente no se puede mezclar el entorno Cygwin y los compiladores MinGW juntos, porque Cygwin cambia las rutas de acceso de las bibliotecas precompiladas.
Si necesita un shell estilo bash, pero no desea usar Cygwin, recomendaría MSYS .
Cygwin en contraste con MinGW
copiado de Cygwin
Las aplicaciones de Cygwin, por principio, no se consideran una "aplicación nativa Win32" porque se basa en la DLL de emulación Cygwin® POSIX ocygwin1.dll
para las funciones de Posix y no usa directamente las funciones de win32. MinGW, por otro lado, proporciona funciones proporcionadas por la API de Win32. Al portar aplicaciones bajo MinGW, las funciones que no sean nativas de Win32, tales comofork()
,mmap()
oioctl()
tendrán que volverse a implementar en equivalentes de Win32 para que la aplicación funcione correctamente.
POSIX (Portable Operating System Interface) "es un documento en evolución y en crecimiento que está siendo producido por IEEE y estandarizado por ANSI e ISO. El objetivo de POSIX es la portabilidad del código fuente de la aplicación" [1].
En términos prácticos, el objetivo se define como la capacidad de escribir una implementación de fuente y ejecutarla en diferentes sistemas (que cumplen con POSIX) con solo recompilación.
GCC es un compilador capaz de cumplir esa promesa y, como tal, necesita una capa de código que acerque a la máquina a los estándares POSIX.
Ese es el núcleo de la respuesta a tu pregunta.
Para ayudar a ver lo que quiero decir, te ofreceré este ejercicio:
- Escriba un programa sin #ifdefs específicos del sistema operativo que tome como entrada del usuario alguna ruta de directorio y escriba para obtener una lista de sus contenidos (un nivel).
Creo que descubrirá que es muy difícil escribir código que usa solo la API WIN32 nativa que compila en cualquier sistema UNIX o LINUX
Solo será un poco menos difícil escribir código que use la API POSIX, como puede hacerlo en cualquier cuadro de LINUX, y compilarlo bajo Windows (DevStudio2005 ahora tiene una sorprendente cantidad de encabezados que cumplen con POSIX ... es posible que pueda obtener cerca).
Lleve el programa LINUX desde arriba y ahora compílelo bajo GCC corriendo bajo Cygwin o MinGW. Apuesto a que compila y corre.
¿Cómo realizó GCC ese pedazo de magia? Los encabezados POSIX e implementaciones subyacentes a ellos proporcionados por Cygwin o MinGW.
¿La confianza de GCC en Cygwin / MinGW bajo Windows tiene más sentido ahora?
- POSIX.4: Programación para el mundo real, Bill O. Gallmeister, O''Reilly & Associates, Inc., página 2
Porque la gente detrás de GCC odia a Windows con pasión (lee Stallman algún día). Por lo tanto, al portar GCC a Windows, hacen todo lo posible para fingir que es simplemente otro Unix.
Eso, y probablemente no quieran perder tiempo eliminando dependencias POSIX del código.
Tiene una opción al compilar gcc para especificar opciones de enable-threads que no sean posix, si no desea admitir pthreads o OpenMP. No hace falta decir que esos no están tan bien probados. Existe algún soporte de fuente cerrada de terceros para OpenMP con subprocesos de Windows, pero su uso con gcc parece violar la licencia. Como la biblioteca pthreads de Windows es una interfaz de nivel superior para la funcionalidad de subprocesos de Windows, tal vez no sea sorprendente que no tenga el mismo rendimiento o encuentre el rechazo de Microsoft al soporte de afinidad. Recientemente, Microsoft comenzó a tolerar gcc en Windows. Hubo un momento en que realmente dijeron que no trabajarían en los errores reportados por los usuarios de gcc, incluso si pudieran ser reproducidos exclusivamente con herramientas de Microsoft.
Windows no ofrece una biblioteca POSIX estándar, por lo que cygwin proporciona uno (cygwin1.dll). Los paquetes gcc que viene con cygwin lo usan.
mingw, por otro lado, no proporciona necesariamente una capa POSIX. La instalación de mingw que uso, por ejemplo, ni siquiera tiene una biblioteca pthread.
Si lo necesito, tendré que instalarlo. Mingw-gcc produce código nativo Win32 (y de hecho se basa en MSVCRT.DLL).
EDITAR: leyendo su edición Ya no estoy seguro si está preguntando por qué gcc necesita bibliotecas mingw / cygwin o si los programas compilados con gcc en Win requieren esas bibliotecas