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 ++?
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 ++?
Réponses:
gcc
et 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' -v
option (il affiche les commandes de la chaîne d'outils backend en cours d'exécution).
argv[0]
quelle invocation doit être utilisée. Ceci est assez courant parmi les principaux utilitaires UNIX.
GCC: Collection de compilateurs GNU
gcc
: Compilateur
g++
GNU C: Compilateur GNU C ++
Les principales différences:
gcc
compilera: les *.c\*.cpp
fichiers en C et C ++ respectivement.g++
compilera: les *.c\*.cpp
fichiers mais ils seront tous traités comme des fichiers C ++.g++
pour lier les fichiers objets, il est automatiquement lié dans les bibliothèques std C ++ ( gcc
ne le fait pas).gcc
la compilation de fichiers C a moins de macros prédéfinies.gcc
la compilation *.cpp
et la g++
compilation de *.c\*.cpp
fichiers ont quelques macros supplémentaires.Macros supplémentaires lors de la compilation de *.cpp
fichiers:
#define __GXX_WEAK__ 1
#define __cplusplus 1
#define __DEPRECATED 1
#define __GNUG__ 4
#define __EXCEPTIONS 1
#define __private_extern__ extern
gcc
passant un -lstdc++
paramètre.
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à. :-)
-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. .
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.
-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.
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).
Quelle est la difference entre g++
et gcc
?
gcc
a é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 gnat
le 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 gcc
déclare que ...
g++
accepte principalement les mêmes options quegcc
et que la valeur par 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 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 gcc
pages de manuel pour plus de détails sur les écarts entre les options gcc
et g++
.
Lequel devrait être utilisé pour le développement général de C ++?
Techniquement, soit gcc
ou 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
, oumachine-gcc
lors de la compilation croisée, oumachine-gcc-version
d'exécuter une version spécifique de GCC. Lorsque vous compilez des programmes C ++, vous devez appeler GCC as à lag++
place.
Une différence notable est que si vous passez un .c
fichier à gcc, il sera compilé en C.
Le comportement par défaut de g ++ consiste à traiter les .c
fichiers en C ++ (sauf indication -x c
contraire).
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 ++.
Je me suis intéressé à la question et j'ai fait quelques expériences
J'ai trouvé cette description ici , mais elle est très courte.
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
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
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]
Mais celui-ci fonctionne toujours sans erreurs
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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
gcc fonctionne très bien comme metatool si vous avez une extension correcte ou définissez des indicateurs -std -x corrects. Voir ça
«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 .
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.
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.
g++
sera également interprété .cc
comme une extension de nom de fichier C ++ uniquement.