Quelle est la différence entre g ++ et gcc? Lesquels devraient être utilisés pour le développement général c ++?
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 (cc1
cc1plus
...) à 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).
GCC: GNU Collection du compilateur
gcc: GNU Compilateur C
g ++: GNU Compilateur C++
Les principales différences:
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
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).
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 quegcc
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
oumachine-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 queg++
à la place.
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++.
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++.
Je me suis intéressé à la question et ai effectué quelques expériences
J'ai trouvé cette description ici , mais c'est très court.
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
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
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]
Mais celui-ci fonctionne toujours sans erreur
$ gcc -x c++ -std=c++98 test_cpp.c
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:
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
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
“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 .
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.
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.