38 votes

Pourquoi GCC-Windows dépend-il de cygwin?

Je ne suis pas un développeur C++, mais j'ai toujours été intéressé par les compilateurs, et je suis intéressé à bricoler avec certains de la GCC trucs (notamment LLVM).

Sur Windows, GCC requiert une POSIX-couche d'émulation (cygwin ou MinGW) pour s'exécuter correctement.

Pourquoi est-ce?

J'utilise beaucoup d'autres logiciels, écrit en C++ et compilé de manière croisée pour différentes plates-formes (Subversion, Firefox, Apache, MySQL), et aucun d'entre eux nécessitent cygwin ou MinGW.

Ma compréhension sur le C++ de meilleures pratiques de programmation, c'est que vous pouvez écrire raisonnablement la plate-forme neutre de code et de traiter de toutes les différences, pendant le processus de compilation.

Alors, quel est le problème avec GCC? Pourquoi ne peut-il pas s'exécuter en mode natif sur Windows?


EDIT:

D'accord, les deux réponses à ce jour-dire, en gros, "GCC utilise la couche posix, car il utilise la posix en-têtes".

Mais ce n'est pas vraiment répondre à la question.

Disons que j'ai déjà un jeu d'en-têtes de mes préférés de la bibliothèque standard. Pourquoi ai-je toujours besoin de la posix en-têtes?

Ne GCC besoin cygwin/mingw à fait EXÉCUTER?

Ou est-il seulement besoin de la couche d'émulation pour les en-têtes et les bibliothèques? Si oui, pourquoi ne puis-je pas juste lui donner un "lib", avec les ressources nécessaires?


MODIFIER À NOUVEAU:

Ok, je vais essayer à nouveau pour clarifier la question...

J'ai aussi écrire du code dans le D Langage de Programmation. L'officiel du compilateur est nommé "dmd" et il y a de officiel compilateur de fichiers binaires pour Windows et linux.

La version Windows n'a pas besoin de toute sorte d'émulation POSIX. Et la version Linux n'a pas besoin de tout type de Win32 émulation. Si le compilateur a des hypothèses au sujet de son environnement, il se cache ces hypothèses assez bien.

Bien sûr, je dois indiquer au compilateur où trouver de la bibliothèque standard et où trouver les bibliothèques statiquement ou dynamiquement lien contre.

GCC, par contre, insiste sur la nécessité de faire semblant qu'il fonctionne dans un environnement posix, et il ME demande de l'humour de ces hypothèses par la mise en place d'une couche d'émulation.

Mais quoi, exactement, dans GCC s'appuie sur la couche? Est-il tout simplement à la recherche pour stdlib en-têtes, et elle l'assume trouverez les en-têtes dans "/usr/lib"?

Si c'est le cas, ne devrais-je pas simplement être en mesure de lui dire de regarder dans "C:/gcc/lib" pour trouver les fichiers d'en-tête?

Ou ne GCC lui-même reposent sur les normes POSIX bibliothèques pour accéder au système de fichiers (et pour d'autres choses)? Si c'est le cas, alors je me demande pourquoi ils ne se contentent pas de manière statique lien avec leur favori windows POSIX bibliothèques. Pourquoi demander à l'utilisateur de configurer les dépendances, quand ils ont pu construire ces dépendances à droite dans l'application?

37voto

David Cournapeau Points 21956

En fait, la question prémisse est fausse: MinGW GCC n'a PAS besoin de Cygwin.

Vous verrez que vous n'avez pas besoin de Cygwin à tous. Il fonctionne nativement sur Windows (32-bit, au moins). Les deux se familiariser avec les outils et les produits binaires sont indépendants de Cygwin.

Le MinGW compilateurs disponibles dans Cygwin sont différentes: elles sont construites sur le Cygwin plate-forme, pour générer du code qui ne dépend pas de la Cygwin moment de l'exécution. Les compilateurs eux-mêmes ne dépendent Cygwin dans ce cas. Mais c'est parce que vous les avez installées à partir de Cygwin.

29voto

Brad Gilbert Points 12724

La Cygwin version de GCC requiert Cygwin pour être installé, pour des programmes compilés.

Le MinGW version ne nécessite pas de quoi que ce soit après la compilation, autre qu'une copie de travail de Windows.

Vous ne pouvez pas vraiment mélanger l'environnement Cygwin, et le MinGW compilateurs ensemble, parce que Cygwin changements les chemins des bibliothèques précompilées.

Si vous avez besoin d'un style bash shell, mais ne voulez pas utiliser Cygwin, je vous recommande de MSYS.

Cygwin en revanche pour MinGW

copié à partir de MinGW Wiki

Cygwin applications, par principe, ne sont pas considérés comme un "Natif application Win32", car elle repose sur la Cygwin® POSIX Emulation DLL ou cygwin1.dll pour les fonctions Posix et ne pas utiliser les fonctions win32 directement. MinGW d'autre part, fournit des fonctions fournies par l'API Win32. Alors que le portage d'applications sous MinGW, les fonctions non-native Win32 tels que fork(), mmap() ou ioctl() devra être réimplémentée dans Win32 équivalents pour l'application de fonctionner correctement.

7voto

AJ S. Points 269

POSIX (Portable Operating System Interface) est une évolution de la, croissance de document qui est produit par l'IEEE et normalisé par l'ANSI et ISO. L'objectif de POSIX est le code-source de la portabilité de l'application" [1].

En termes pratiques, l'objectif est défini comme la capacité à écrire une source de mise en œuvre et l'exécuter sur différentes (POSIX) un système avec seulement recompilation.

GCC est un compilateur capable de livrer la promesse, et en tant que tel, il a besoin d'une couche de code qui affiche une machine "jusqu'à" normes de POSIX.

C'est le cœur de la réponse à votre question.

Pour vous aider à voir ce que je veux dire, je vais vous proposer cet exercice:

  • Écrire un programme sans OS #ifdefs qui prend comme entrée de l'utilisateur certains chemin d'accès au répertoire et écrit sur la sortie standard une liste de son contenu (un niveau).

Je pense que vous trouverez qu'il est très difficile d'écrire du code qui utilise l'API WIN32 natif qui compile sur n'importe quel système UNIX ou LINUX

Il sera seulement un peu moins difficile à écrire du code qui utilise l'API POSIX - que vous le pouvez sur n'importe quel LINUX - et l'ont compiler sous Windows (DevStudio2005 a un nombre surprenant de POSIX-têtes maintenant...vous pourriez être en mesure de se rapprocher).

Vous prendre LINUX programme à partir de ci-dessus et maintenant compiler avec GCC fonctionnant sous Cygwin ou MinGW. Je parie qu'il compile et s'exécute.

Comment avez-GCC effectuer que peu de magie? POSIX en-têtes et des implémentations sous-jacentes fournies par Cygwin ou MinGW.

Ne GCC recours à Cygwin/MinGW sous Windows plus de sens maintenant?

  1. POSIX.4: Programmation pour le Monde Réel, le projet de Loi O. Gallmeister, O'Reilly & Associates, Inc., pg 2

6voto

Walter Bright Points 2967

J'essaie de faire en sorte que mes programmes sous Windows se comportent comme un bon citoyen Windows, et sous Linux comme un bon citoyen Linux.

3voto

Artyom Points 17387

Pourquoi? Parce que lors de la GCC a été créé, Windows 32 bits même n'avait pas sorties...

Pour être plus exact --- il a été développé pour UNIX/Posix OS. Plus tard, il a été porté sur windows.

Windows n'est pas POSIX compient système. Il n'a même pas fournir des fonctionnalités de base. Essayez de trouver readdir ou stat sous Windows compilateur? Et c'est donc extrêmement fonctionnalités de base que vous devez écrire le compilateur!

Juste pour être clair, GCC programmes compilés habituellement requise uniquement une mingw32.dll pour ajouter des fonctionnalités manquantes pour être en mesure d'exécuter.

Alors... vous Vous demandez pourquoi GCC nécessite une certaine couche POSIX? Parce que l'OS de Windows n'est pas POSIX système d'exploitation.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X