Quelle est la différence entre g ++ et gcc?

875

Quelle est la différence entre g ++ et gcc? Lequel d'entre eux devrait être utilisé pour le développement général de C ++?

Brian R. Bondy
la source
g ++ => compilateur c ++ gcc => compilateur c
Nagappa

Réponses:

727

gccet g++sont des pilotes de compilation de la collection de compilateurs GNU (qui n'était autrefois que le compilateur GNU C ).

Même s'ils déterminent automatiquement les backends ( cc1 cc1plus...) à appeler en fonction du type de fichier, sauf en cas de substitution -x language, ils présentent quelques différences.

La différence probablement la plus importante dans leurs valeurs par défaut est contre quelles bibliothèques ils se lient automatiquement.

Selon les options de lien de documentation en ligne de GCC et la façon dont g ++ est invoqué , g++est équivalent à gcc -xc++ -lstdc++ -shared-libgcc(le premier est une option de compilation, les deuxièmes sont des options de l'éditeur de liens). Cela peut être vérifié en exécutant les deux avec l' -voption (il affiche les commandes de la chaîne d'outils backend en cours d'exécution).

Kodiologue
la source
13
De cette réponse, je conclus qu'effectivement la commande g ++ est juste gcc avec un tas de drapeaux .. Pourquoi alors, il y a deux binaires différents (approximativement de la même taille) pour gcc et g ++ sous linux?. Ne devrions-nous pas avoir un seul binaire et un lien symbolique (ou quelque chose dans ce sens)?
UchihaItachi
9
@Uchihaltachi, ces fichiers sont des liens durs et lorsqu'ils sont démarrés, ils vérifient argv[0]quelle invocation doit être utilisée. Ceci est assez courant parmi les principaux utilitaires UNIX.
Relish
439

GCC: Collection de compilateurs GNU

  • Renvoie à toutes les différentes langues prises en charge par le compilateur GNU.

gcc: Compilateur
g++GNU C: Compilateur GNU C ++

Les principales différences:

  1. gcccompilera: les *.c\*.cppfichiers en C et C ++ respectivement.
  2. g++compilera: les *.c\*.cppfichiers mais ils seront tous traités comme des fichiers C ++.
  3. De plus, si vous utilisez g++pour lier les fichiers objets, il est automatiquement lié dans les bibliothèques std C ++ ( gccne le fait pas).
  4. gcc la compilation de fichiers C a moins de macros prédéfinies.
  5. gccla compilation *.cppet la g++compilation de *.c\*.cppfichiers ont quelques macros supplémentaires.

Macros supplémentaires lors de la compilation de *.cppfichiers:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
Martin York
la source
37
Vous pouvez lier la bibliothèque std C ++ en gccpassant un -lstdc++paramètre.
Denilson Sá Maia
16
Il y a plus de différences entre 'gcc' et 'g ++' que seulement les bibliothèques standard, donc vous gcc -lstdc++n'obtiendrez toujours pas le même comportement que g++. Nous avons mis tout ce comportement spécifique à la langue dans son propre pilote pour une raison, c'est pour ça qu'il est là. :-)
Ti Strga
8
Mon commentaire ne parle pas de simplement relier ... c'est le point. Même en limitant simplement la discussion à la liaison (ce que votre réponse n'a pas été), un utilisateur ne pourra toujours pas utiliser l'intégralité de la bibliothèque standard C ++ en spécifiant uniquement -lstdc++, car il y aura des dépendances manquantes sur les informations mathématiques, RTTI et d'exception. Le fait qu'un lien de test donné échoue ou échoue dépendra du système d'exploitation et des fonctionnalités C ++ utilisées par le test, ce qui explique pourquoi toutes ces connaissances sont intégrées dans le pilote g ++ au lieu d'être laissées à la discrétion de l'utilisateur. .
Ti Strga
10
Croyez-moi, nous avons beaucoup cette discussion, généralement lorsqu'un utilisateur Linux essaie de déplacer son Makefile incomplet vers une autre plate-forme. :-) L'étape du lien g ++ fait beaucoup plus que gcc -lstdc++sur les autres OS, surtout quand la cible est une plate-forme embarquée. Heureusement, c'est pourquoi nous expédions un g ++ en premier lieu.
Ti Strga
10
Les chaînes de spécifications sont conçues pour être spécifiques au compilateur, elles-mêmes spécifiques au système d'exploitation et à la cible. Donc, si vous utilisez -dumpspec(par exemple) un compilateur croisé ciblant un système intégré, vous verrez les différences. Il y a plus que de simples différences de l'éditeur de liens ... ce qui est encore une fois votre réponse (macros de préprocesseur, chemins d'accès inclus, bibliothèques d'exécution multiples). Nous semblons parler les uns des autres, mais en tant qu'ancien responsable du GCC, je vous assure que je connais bien les frontends et ce qu'ils ne sont pas.
Ti Strga
82

Pour c ++, vous devez utiliser g ++.

C'est le même compilateur (par exemple la collection de compilateurs GNU). GCC ou G ++ choisissent simplement un frontal différent avec différentes options par défaut.

En bref: si vous utilisez g ++, le frontend indiquera à l'éditeur de liens que vous souhaiterez peut-être établir un lien avec les bibliothèques standard C ++. Le frontend de gcc ne fera pas cela (il pourrait également être lié avec eux si vous passez les bonnes options de ligne de commande).

Nils Pipenbrinck
la source
3
+1 De plus, ma page de manuel GNU / Linux gcc indique: "Lorsque vous compilez des programmes C ++, vous devez plutôt invoquer GCC en tant que g ++."
Vue elliptique
35

Quelle est la difference entre g++et gcc?

gcca évolué d'un seul langage "GNU C Compiler" pour devenir un "GNU Compiler Collection" multilingue. Le terme "GNU C Compiler" est encore parfois utilisé dans le contexte de la programmation C.

Le g++ est le compilateur C ++ pour la GNU Compiler Collection. Tout comme gnatle compilateur Ada pour gcc. voir Utilisation de la collection de compilateurs GNU (GCC)

Par exemple, la commande Ubuntu 16.04 et 18.04 man g++renvoie la GCC(1)page de manuel.

Ubuntu 16.04 et 18.04 man gccdéclare que ...

g++ accepte principalement les mêmes options que gcc

et que la valeur par défaut ...

... l'utilisation de gccn'ajoute pas la bibliothèque C ++. g++est un programme qui appelle GCC et spécifie automatiquement la liaison avec la bibliothèque C ++. Il traite les fichiers .c, .h et .i comme des fichiers source C ++ au lieu de fichiers source C, sauf si -x est utilisé. Ce programme est également utile lors de la précompilation d'un fichier d'en-tête C avec une extension .h pour une utilisation dans les compilations C ++.

Recherchez les gccpages de manuel pour plus de détails sur les écarts entre les options gccet g++.

Lequel devrait être utilisé pour le développement général de C ++?

Techniquement, soit gccou g++peut être utilisé pour le développement général C ++ avec les paramètres d'option applicables. Cependant, le g++comportement par défaut est naturellement aligné sur un développement C ++.

La page de manuel Ubuntu 18.04 a ajouté le paragraphe suivant:

La manière habituelle d'exécuter GCC est d'exécuter l'exécutable appelé gcc, ou machine-gcclors de la compilation croisée, ou machine-gcc-versiond'exécuter une version spécifique de GCC. Lorsque vous compilez des programmes C ++, vous devez appeler GCC as à la g++place.

l --marc l
la source
21

Une différence notable est que si vous passez un .cfichier à gcc, il sera compilé en C.

Le comportement par défaut de g ++ consiste à traiter les .cfichiers en C ++ (sauf indication -x ccontraire).

njsf
la source
19
(Tard, mais pour la postérité,) Comme d'autres réponses l'ont souligné, ce n'est en aucun cas "la seule différence notable", à moins que le lecteur n'ait une définition biaisée de la notabilité.
underscore_d
16

Bien que les commandes gcc et g ++ fassent des choses très similaires, g ++ est conçu pour être la commande que vous invoquerez pour compiler un programme C ++; il est destiné à faire automatiquement la bonne chose.

Dans les coulisses, c'est vraiment le même programme. Si je comprends bien, les deux décident de compiler un programme en C ou en C ++ en fonction de l'extension du nom de fichier. Les deux sont capables de se lier à la bibliothèque standard C ++, mais seul g ++ le fait par défaut. Donc, si vous avez un programme écrit en C ++ qui n'a pas besoin d'être lié à la bibliothèque standard, gcc fera la bonne chose; mais alors, g ++ aussi. Il n'y a donc vraiment aucune raison de ne pas utiliser g ++ pour le développement général de C ++.

zaphod
la source
12

Je me suis intéressé à la question et j'ai fait quelques expériences

  1. J'ai trouvé cette description ici , mais elle est très courte.

  2. Ensuite, j'ai essayé d'expérimenter gcc.exe et g ++. Exe sur ma machine Windows:

    $ g++ --version | head -n1 
    g++.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
    
    $ gcc --version | head -n1
    gcc.exe (gcc-4.6.3 release with patches [build 20121012 by perlmingw.sf.net]) 4.6.3
  3. J'ai essayé de compiler des fichiers de test simples c89, c99 et c ++ 1998 et cela fonctionne bien pour moi avec des extensions correctes correspondant à la langue

    gcc -std=c99 test_c99.c
    gcc -std=c89 test_c89.c 
    g++ -std=c++98 test_cpp.cpp
    gcc -std=c++98 test_cpp.cpp
  4. Mais quand j'essaye d'exécuter l'outil "collection de compilateurs GNU" de cette façon:

    $ gcc -std=c++98 test_cpp.c
    cc1.exe: warning: command line option '-std=c++98' is valid for C++/ObjC++ but not for C [enabled by default]
  5. Mais celui-ci fonctionne toujours sans erreurs

    $ gcc -x c++ -std=c++98 test_cpp.c
  6. Et cela aussi

    $ g++ -std=c++0x test_cpp_11.cpp 

Fichiers de test ps

$ cat test_c89.c test_c99.c test_cpp.cpp

// C89 compatible file
int main()
{
    int x[] = {0, 2};
    return sizeof(x);
}

// C99 compatible file
int main()
{
    int x[] = {[1]=2};
    return sizeof(x);
}

// C++1998,2003 compatible file
class X{};
int main()
{
    X x;
    return sizeof(x);
}

// C++11
#include <vector>
enum class Color : int{red,green,blue}; // scoped enum
int main()
{
    std::vector<int> a {1,2,3}; // bracket initialization
    return 0;
}

Résultats:

  1. Si vous regardez l'arborescence des processus, il semble que gcc et g ++ sont des backend à d'autres outils, qui dans mon environnement sont: cc1plus.exe, cc1.exe, collect2.exe, as.exe, ld.exe

  2. gcc fonctionne très bien comme metatool si vous avez une extension correcte ou définissez des indicateurs -std -x corrects. Voir ça

bruziuz
la source
9

«GCC» est un terme courant pour la collection de compilateurs GNU. Il s'agit à la fois du nom le plus général du compilateur et du nom utilisé lorsque l'accent est mis sur la compilation de programmes C (comme l'abréviation signifiait auparavant «GNU C Compiler»).

En se référant à la compilation C ++, il est habituel d'appeler le compilateur «G ++». Puisqu'il n'y a qu'un seul compilateur, il est également exact de l'appeler «GCC» quel que soit le contexte du langage; cependant, le terme «G ++» est plus utile lorsque l'accent est mis sur la compilation de programmes C ++.

Vous pouvez en lire plus ici .

Minh-Triet Pham Tran
la source
0

Je testais gcc et g ++ dans un système Linux. En utilisant MAKEFILE, je peux définir le compilateur utilisé par "GNU make". J'ai testé avec la fonction de localisation dite de "mémoire dynamique" de "C plus plus" par:

int main(){

int * myptr = new int;
* myptr = 1;
printf("myptr[0] is %i\n",*myptr);
return 0;
}

Seul g ++ peut compiler avec succès sur mon ordinateur tandis que gcc signalera une erreur

undefined reference to `operator new(unsigned long)'

Donc ma propre conclusion est que gcc ne supporte pas complètement "C plus plus". Il semble que choisir g ++ pour les fichiers source C ++ soit une meilleure option.

magicmax
la source
Vous devez faire deux emplois: 1. Choisir la langue 2. choisir une suhch bibliothèque comme libstdc ++
Golfe Persique
-1

gcc et g ++ sont tous deux un compilateur GNU. Ils compilent tous les deux c et c ++. La différence est pour les fichiers * .c gcc le traite comme un programme ac, et g ++ le voit comme un programme ac ++. * Les fichiers .cpp sont considérés comme des programmes c ++. c ++ est un super ensemble de c et la syntaxe est plus stricte, alors faites attention au suffixe.

Marcus Thornton
la source
1
C ++ est un langage différent, pas un sur-ensemble strict de C, donc la compilation avec le mauvais langage cible pourrait bien produire des résultats inattendus. Notez également que g++sera également interprété .cccomme une extension de nom de fichier C ++ uniquement.
underscore_d