web-dev-qa-db-fra.com

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

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.?

80
vehomzzz

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 GNU compilateur 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++.
  • 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 sous Solaris, il se pourrait que cc soit l'ancien compilateur C basé sur BSD de /usr/ucb. En pratique, ce n'est généralement pas installé et il y a juste un talon 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 lorsque cela est nécessaire, et inutilisable pour le travail logiciel moderne car il ne prend pas en charge le standard C. Vous devez utiliser des noms de compilateur alternatifs ('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 était appelé "cc" et le logiciel d'auto-configuration retombe 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/IEC 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 précédemment, la réponse est en partie spécifique à la plate-forme et en partie générique.

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 qui est é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++ dispose d'un plus grand ensemble 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 distincts avec des conventions distinctes pour des choses telles que la gestion des exceptions et le changement de nom (et le changement de nom est délibérément différent pour garantir 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 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 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 de langage, les compilateurs ont généralement une taille assez proche des normes actuelles (C++ 98, C++ 2003, C99), mais il existe généralement de petites différences entre le langage standard et le langage pris en charge 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 non défini, vous obtiendrez des résultats différents à différents moments. Il existe également de nombreuses options (en particulier avec le GCC) pour modifier le comportement du compilateur. Le GCC a une variété d'extensions qui vous simplifient la vie si vous savez que vous ne ciblez que cette famille de compilateurs.

105
Jonathan Leffler

CC est 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, cela indiquera /usr/bin/cc, le vrai c complier (pilote). Sur les plates-formes Linux, CC pointe presque toujours vers /usr/bin/gcc.

gcc est le binaire du pilote pour la collection de compilateurs GNU. Il peut compiler C, C++ et éventuellement d'autres langues; 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 la compilation de C++. Notamment (selon mon expérience), g++ liera libstdc ++ par défaut, contrairement à gcc.

22
Managu

Je veux ajouter une seule information sur ce que cc sous Linux. Il est lié à gcc. Pour le vérifier. enter image description here

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++
3
Uddhav Gautam