2009-10-04 9 views
56

Quelles sont les différences entre les 3 compilateurs CC, gcc, g ++ lors de la compilation du code C et C++ en termes de génération de code assembleur , bibliothèques disponibles, les caractéristiques linguistiques, etc.?Différence entre CC, gcc et g ++?

+0

Comme indiqué dans ma réponse - la réponse à votre question dépend de la plate-forme, mais la plate-forme n'est pas spécifiée. –

+3

Question connexe: http://stackoverflow.com/questions/172587/what-is-the-difference-between-g-and-gcc/173007 –

Répondre

82

La réponse à cette question est spécifique à la plateforme; Ce qui se passe sous Linux est différent de ce qui se passe sur Solaris, par exemple.

La partie facile (car il n'est pas la plate-forme spécifique) est la séparation des 'gcc' et 'g ++':

  • gcc est le compilateur GNU C du GCC (GNU Compiler Collection).
  • g ++ est le compilateur GNU C++ du GCC.

La partie difficile, car elle est spécifique à la plate-forme, est la signification de 'CC' (et 'cc'). Sous Solaris, CC est normalement le nom du compilateur Sun C++.

  • Sur Solaris, cc est normalement le nom du compilateur Sun C.
  • Sous Linux, s'il existe, CC est probablement un lien vers g ++.
  • Sur Linux, cc est un lien vers gcc. Toutefois, même sur Solaris, il se peut que cc soit l'ancien compilateur C basé sur BSD de /usr/ucb. En pratique, cela n'est généralement pas installé et il y a juste un bout qui échoue, causant des ravages sur ceux qui essaient de compiler et d'installer un logiciel auto-configurant. Sur HP-UX, le 'cc' par défaut est toujours un compilateur C R 0 uniquement installé pour permettre la relibération du noyau lorsque nécessaire, et inutilisable pour les logiciels modernes car il ne prend pas en charge le standard C. avoir à utiliser des noms de compilateurs alternatifs ('IIRC'). De même, sous AIX, le compilateur C du système utilise des noms tels que 'xlc' ou 'xlc32'.

    Classiquement, le compilateur système par défaut s'appelait 'cc' et le logiciel d'autoconfiguration retombe sur ce nom lorsqu'il ne sait pas quoi d'autre utiliser.

    a tenté de légiférer Posix sa façon de contourner cela en exigeant des C89 programmes (à l'origine) et plus tard C99 d'exister; ce sont les compilateurs compatibles avec les normes ISO/IEC 9899: 1989 et 9899: 1999. Il est douteux que POSIX ait réussi.


    La question porte sur les différences en termes de fonctionnalités et de bibliothèques. Comme précédemment, la réponse est en partie spécifique à la plate-forme, et générique en partie.

    La grande fracture est entre les compilateurs C et les compilateurs C++. Les compilateurs C++ accepteront les programmes C++ et ne compileront pas de programmes C arbitraires. (Bien qu'il soit possible d'écrire C dans un sous-ensemble qui est également compris par C++, beaucoup de programmes C ne sont pas des programmes C++ valides). De même, les compilateurs C accepteront les programmes C et rejetteront la plupart des programmes C++ (car la plupart des programmes C++ utilisent des constructions non disponibles en C).

    L'ensemble des bibliothèques disponibles dépend de la langue. Les programmes C++ peuvent généralement utiliser des bibliothèques C sur une plate-forme donnée; Les programmes C ne peuvent généralement pas utiliser les bibliothèques C++. Ainsi, C++ a un plus grand nombre de bibliothèques disponibles. Notez que si vous êtes sur Solaris, le code objet produit par CC n'est pas compatible avec le code objet produit par g ++ - ce sont deux compilateurs séparés avec des conventions séparées pour des choses telles que la gestion des exceptions et la gestion des noms (et la gestion des noms est délibérément différente pour s'assurer que les fichiers objets incompatibles ne sont pas liés ensemble!). Cela signifie que si vous voulez utiliser une bibliothèque compilée avec CC, vous devez compiler tout votre programme avec CC. Cela signifie également que si vous voulez utiliser une bibliothèque compilée avec CC et une autre compilée avec g ++, vous n'avez pas de chance. Vous devez recompiler au moins l'une des bibliothèques.

    En termes de qualité de l'assembleur généré, le GCC (GNU Compiler Collection) fait un très bon travail. Mais parfois, les compilateurs natifs fonctionnent un peu mieux. Les compilateurs d'Intel ont des optimisations plus étendues qui n'ont pas encore été répliquées dans GCC, je crois. Mais de telles pontifications sont dangereuses alors que nous ne savons pas quelle plateforme vous intéresse. En termes de fonctionnalités de langage, les compilateurs sont généralement assez proches des standards actuels (C++ 98, C++ 2003, C99), mais il y a généralement de petites différences entre la langue standard et le langage supporté par le compilateur. L'ancien support standard C89 est essentiellement le même (et complet) pour tous les compilateurs C. Il y a des différences dans les coins les plus sombres de la langue. Vous devez comprendre «comportement indéfini», «comportement défini par le système» et «comportement non spécifié»; Si vous invoquez un comportement indéfini, vous obtiendrez des résultats différents à des moments différents. Il y a aussi beaucoup d'options (particulièrement avec le GCC) pour modifier le comportement du compilateur. Le GCC a une variété d'extensions qui simplifient la vie si vous savez que vous ne faites que cibler cette famille de compilateurs.

  • 20

    CC est une variable d'environnement faisant référence au compilateur C du système. Ce que cela indique (bibliothèques accessibles, etc.) dépend de la plateforme. Souvent, il pointera vers /usr/bin/cc, le véritable c complier (pilote). Sur les plates-formes Linux, CC pointe presque toujours vers /usr/bin/gcc.

    gcc est le pilote binaire pour la collection du compilateur GNU. Il peut compiler C, C++ et éventuellement d'autres langages; il détermine la langue par l'extension de fichier.

    g++ est un pilote binaire comme gcc, mais avec quelques options spéciales définies pour compiler C++. Notamment (d'après mon expérience), g++ liera libstdC++ par défaut, tandis que gcc ne le fera pas.

    +1

    Pouvez-vous expliquer ce que vous entendez par "pilote binaire"? –

    +3

    La plupart des compilateurs C, mais spécifiquement GCC, ont un certain nombre de programmes qui effectuent la compilation. Il existe un programme de niveau supérieur, appelé 'gcc', qui est le pilote du compilateur; il analyse une myriade d'options de ligne de commande et orchestre les autres phases du compilateur - l'analyseur/analyseur, l'optimiseur, l'assembleur et l'éditeur de liens (le préprocesseur n'est généralement pas une phase distincte à moins que vous ne demandiez que le prétraitement). Il (le pilote du compilateur) est un programme assez complexe, même s'il ne touche jamais un fichier source C lui-même. –

    +3

    CC est également le compilateur Sun C++ - et non une variable d'environnement. –

    Questions connexes