Différence entre CC, gcc et g ++?

106

Quelle est la différence entre les 3 compilateurs CC, gcc, g ++ lors de la compilation de code C et C ++ en termes de génération de code d'assemblage, de bibliothèques disponibles, de fonctionnalités de langage, etc.?

vehomzzz
la source
1
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.
Jonathan Leffler
3
Question connexe: stackoverflow.com/questions/172587/…
Martin York

Réponses:

125

La réponse à cela est spécifique à la plate-forme; ce qui se passe sous Linux est différent de ce qui se passe sous Solaris, par exemple.

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

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

Le plus difficile, car il est spécifique à la plate-forme, est la signification de «CC» (et «cc»).

  • Sous Solaris, CC est normalement le nom du compilateur Sun C ++.
  • Sous Solaris, cc est normalement le nom du compilateur Sun C.
  • Sous Linux, s'il existe, CC est probablement un lien vers g ++.
  • Sous Linux, cc est un lien vers gcc.

Cependant, 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 stub qui échoue, faisant des ravages sur ceux qui essaient de compiler et d'installer des logiciels auto-configurables.

Sur HP-UX, le 'cc' par défaut est toujours un compilateur C K & R uniquement installé pour permettre la reconnexion du noyau si nécessaire, et inutilisable pour les logiciels modernes car il ne prend pas en charge la norme C.Vous devez utiliser d'autres noms de compilateurs ('acc' IIRC). De même, sous AIX, le compilateur système C porte des noms tels que «xlc» ou «xlc32».

Classiquement, le compilateur système par défaut s'appelait «cc» et le logiciel auto-configurable se rabat sur ce nom lorsqu'il ne sait pas quoi utiliser d'autre.

POSIX a tenté de légiférer pour contourner ce problème en exigeant que les programmes c89 (à l'origine) et plus tard c99 existent; ce sont les compilateurs compatibles avec les normes ISO / CEI 9899: 1989 et 9899: 1999 C. 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 auparavant, la réponse est en partie spécifique à la plate-forme et générique en partie.

Le grand fossé se situe 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 également compris par C ++, de nombreux 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 pour l'utilisation 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 ensemble de bibliothèques disponibles.

Notez que si vous êtes sous 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 distinctes pour des choses telles que la gestion des exceptions et la modification des noms (et la modification des noms est délibérément différent pour s'assurer que les fichiers objets incompatibles ne sont pas liés ensemble!). Cela signifie que si vous souhaitez utiliser une bibliothèque compilée avec CC, vous devez compiler tout votre programme avec CC. Cela signifie également que si vous souhaitez 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é d'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 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 de quelle plate-forme vous êtes concerné.

En termes de fonctionnalités du langage, les compilateurs sont tous généralement assez proches des standards actuels (C ++ 98, C ++ 2003, C99), mais il existe généralement de petites différences entre le langage 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 existe des différences dans les coins les plus sombres de la langue. Vous devez comprendre le «comportement non défini», le «comportement défini par le système» et le «comportement non spécifié»; si vous invoquez un comportement non défini, vous obtiendrez des résultats différents à des moments différents. Il existe également de nombreuses options (notamment 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 ciblez uniquement cette famille de compilateurs.

Jonathan Leffler
la source
1
Et sur OSX (Sierra 10.2 au moins), c'est un lien symbolique vers clang.
Josh Kodroff
27

CCest une variable d'environnement faisant référence au compilateur C du système. Ce qu'il pointe (bibliothèques accessibles, etc.) dépend de la plate-forme. Souvent, il pointera vers /usr/bin/ccle complicateur c réel (pilote). Sur les plates-formes Linux, CCpointe presque toujours vers /usr/bin/gcc.

gccest le binaire du pilote pour la collection de compilateurs 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 de type binaire gcc, mais avec quelques options spéciales définies pour la compilation de C ++. Notamment (d'après mon expérience), g++liera libstdc ++ par défaut, alors que gccnon.

Managu
la source
1
Pouvez-vous expliquer ce que vous entendez par «pilote binaire»?
Edan Maor
5
La plupart des compilateurs C, mais GCC en particulier, ont un certain nombre de programmes qui font le travail de 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, généralement (le préprocesseur n'est généralement pas une phase distincte de nos jours, à moins que vous ne demandiez uniquement un 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.
Jonathan Leffler
3
CC est également le compilateur Sun C ++ - et non une variable d'environnement.
Jonathan Leffler
1
Le compilateur C ++ de SGI est également CC.
alex tingle
Eh bien, je suppose que Managu pense que ./configure+ makepeut prendre une variable d'environnement nommée CCpour affecter le compilateur C utilisé, mais sinon, il n'y a généralement pas de variable d'environnement portant ce nom.
éphémère
6

Je veux ajouter juste une information sur ce que cc sous Linux. Il est lié à gcc. Pour le vérifier. entrez la description de l'image ici

De même, la même chose avec c ++.

uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ whereis c++
c++: /usr/bin/c++ /usr/include/c++ /usr/share/man/man1/c++.1.gz  
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /usr/bin/c++
lrwxrwxrwx 1 root root 21 Jul 31 14:00 /usr/bin/c++ -> /etc/alternatives/c++
uddhavpgautam@UbuntuServer1604:~/Desktop/c++$ ls -l /etc/alternatives/c++
lrwxrwxrwx 1 root root 12 Jul 31 14:00 /etc/alternatives/c++ -> /usr/bin/g++
Uddhav Gautam
la source