web-dev-qa-db-fra.com

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

Quelle est la différence entre g ++ et gcc? Lesquels devraient être utilisés pour le développement général c ++?

790
Brian R. Bondy

gcc et g++ sont des pilotes de compilation de la collection GNU Compiler (qui était une fois temps juste le GNU compilateur C ).

Même s'ils déterminent automatiquement quels serveurs (cc1cc1plus ...) à appeler en fonction du type de fichier, à moins qu'ils ne soient remplacés par -x language, ils présentent certaines différences.

La différence probablement la plus importante dans leurs valeurs par défaut concerne les bibliothèques auxquelles elles sont automatiquement reliées.

Selon la documentation en ligne de GCC options de lien et comment g ++ est appelé , g++ est équivalent à gcc -xc++ -lstdc++ -shared-libgcc (le premier est une option du compilateur, le deuxième deux sont des options de l'éditeur de liens). Cela peut être vérifié en exécutant les deux avec l'option -v (elle affiche les commandes de la chaîne d'outils en cours d'exécution).

665
Mike F

GCC: GNU Collection du compilateur

  • Référents vers toutes les langues prises en charge par le compilateur GNU.

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

Les principales différences:

  1. gcc compilera: * .c/*. cpp les fichiers en tant que C et C++, respectivement.
  2. g ++ compilera: * .c/*. cpp, mais tous seront traités comme des fichiers C++.
  3. De plus, si vous utilisez g ++ pour lier les fichiers objet, il se connecte automatiquement dans les bibliothèques std C++ (gcc ne le fait pas).
  4. la compilation de fichiers C par gcc a moins de macros prédéfinies.
  5. gcc compiler * .cpp et g ++ compiler les fichiers * .c/*. cpp ont quelques macros supplémentaires.

Macros supplémentaires lors de la compilation de fichiers * .cpp:

#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
405
Martin York

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

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

En un mot: si vous utilisez g ++, l'interface indiquera à l'éditeur de liens que vous souhaiterez peut-être créer un lien avec les bibliothèques standard C++. L’interface gcc ne le fera pas (elle pourrait également être reliée si vous passez les bonnes options en ligne de commande).

73
Nils Pipenbrinck

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

gcc a évolué d'un langage unique "Compilateur GNU C" pour devenir une "Collection de compilateurs GNU multi-langues". Le terme "Compilateur C GNU" est encore utilisé parfois dans le contexte de la programmation en C.

Le g++ est le compilateur C++ de la collection de compilateurs GNU. Comme gnat est le compilateur Ada pour gcc. voir Utilisation du GNU Collection du compilateur (GCC)

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

Les versions Ubuntu 16.04 et 18.04 man gcc indiquent que ...

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

et que le défaut ...

... l'utilisation de gcc n'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 en tant que 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 à utiliser dans les compilations C++.

Recherchez dans les pages de manuel gcc pour plus de détails sur les écarts d’option entre gcc et g++.

Lequel devrait-on utiliser pour le développement général de c ++?

Techniquement, gcc ou g++ peuvent être utilisés pour le développement général C++ avec les paramètres d’option applicables. Cependant, le comportement par défaut de g++ 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 consiste à exécuter l’exécutable nommé gcc ou machine-gcc lors de la compilation croisée, ou à machine-gcc-version d’exécuter une version spécifique de GCC. Lorsque vous compilez des programmes C++, vous devez appeler GCC en tant que g++ à la place.

29
l --marc l

La seule différence notable est que si vous passez un .c à gcc, il sera compilé en tant que C, alors que g ++ le traitera toujours en tant que C++.

16
njsf

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

En coulisse, 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 lier avec 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 ce qu’il faut; mais alors, il en serait de même pour g ++. Il n'y a donc vraiment aucune raison de ne pas utiliser g ++ pour le développement général en C++.

16
zaphod

Je me suis intéressé à la question et ai effectué quelques expériences

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

  2. Ensuite, j'ai essayé d'expérimenter avec 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 ça marche bien pour moi avec des extensions correctes pour le langage

    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 de lancer l'outil "gnu compiler collection" 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 erreur

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

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

p.s. Fichiers de test

$ 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;
}

Constatations:

  1. Si on regarde l’arbre de processus, alors il semble que gcc, et g ++ est 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 méta-outil si vous avez l'extension correcte ou si vous définissez les indicateurs -std -x corrects. Voir this

11
bruziuz

“GCC” est un terme abrégé commun pour la GNU Compiler Collection. C'est à la fois le nom le plus général du compilateur et le nom utilisé lorsque l'accent est mis sur la compilation de programmes C (l'abréviation désignant auparavant "Compilateur C GNU").

Quand on parle de compilation C++, il est habituel d'appeler le compilateur "G ++". Puisqu'il n'y a qu'un seul compilateur, il est également correct de l'appeler "GCC", quel que soit le contexte linguistique. Cependant, le terme "G ++" est plus utile lorsque l'accent est mis sur la compilation de programmes C++.

Vous pouvez en lire plus ici .

9

gcc et g ++ sont tous deux GNU compilateur. Ils compilent tous deux c et c ++. La différence concerne les fichiers * .c gcc le considère comme un programme c et g ++ le considère comme un programme c ++. Les fichiers * .cpp sont considérés comme des programmes c ++. c ++ est un super ensemble de c et la syntaxe est plus stricte, soyez donc prudent avec le suffixe.

0
Marcus Thornton

Je testais gcc et g ++ sur un système linux. En utilisant MAKEFILE, je peux définir le complémenteur utilisé par "GNU make". J'ai testé avec la fonction de localisation dite "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, alors que gcc signalera une erreur.

undefined reference to `operator new(unsigned long)'

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

0
magicmax