GCC vs G++ : Quelle est la différence et quel compilateur C++ choisir ?

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

Introduction : Le drame aux deux noms

\n\n

Si vous avez déjà essayé de compiler un programme en C++ sous Linux ou macOS, vous avez sûrement rencontré deux commandes similaires : gcc et g++. À première vue, la différence entre elles est minime — les deux lancent un compilateur, les deux savent travailler avec C et C++. Mais si vous vous trompez dans le choix, vous obtenez une montagne d'erreurs d'édition de liens qui peuvent gâcher la soirée même d'un développeur expérimenté.

\n\n

Cette question est l'une des plus populaires sur Stack Overflow (plus de 200 000 vues !). Les débutants pensent souvent : « Puisque gcc sait compiler le C++, pourquoi ai-je besoin de g++ ? » Et pourtant. Aujourd'hui, nous allons une fois pour toutes comprendre le piège, avec des exemples de code réels. Vous saurez quand utiliser gcc, quand utiliser g++, et comment éviter le piège des dépendances implicites.

\n\n

Bref aperçu : qu'est-ce que GCC ?

\n\n

GCC (GNU Compiler Collection) n'est pas un seul compilateur, mais tout un ensemble d'outils. Il comprend des compilateurs pour C, C++, Fortran, Ada et d'autres langages. Historiquement, l'abréviation signifiait « GNU C Compiler », mais avec les années, le projet s'est développé.

\n\n

La commande gcc est un pilote qui lance par défaut le compilateur pour le langage C. La commande g++ est le même pilote, mais avec des drapeaux qui activent la prise en charge du C++. Cela semble être un détail. Mais c'est précisément ce « détail » qui décide si votre code fonctionnera ou non.

\n\n

La principale différence : l'édition de liens des bibliothèques standard

\n\n

Imaginez que vous écrivez un programme simple en C++ :

\n\n
#include <iostream>\nint main() {\n    std::cout << "Bonjour, le monde !" << std::endl;\n    return 0;\n}\n
\n\n

Essayons de le compiler de deux manières :

\n\n
gcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n
\n\n

Résultat :

\n
    \n
  • g++ — la compilation réussira.
  • \n
  • gcc — vous obtiendrez une erreur d'édition de liens undefined reference to `std::cout'.
  • \n
\n\n

Pourquoi ? Parce que gcc ne lie pas automatiquement la bibliothèque libstdc++ (la bibliothèque standard C++). Il pense que vous compilez du C pur, et en C il n'y a pas de iostream, std::string et autres joies du C++. g++ le fait automatiquement.

\n\n

Bien sûr, vous pouvez forcer gcc à fonctionner avec le C++ manuellement, en ajoutant le drapeau -lstdc++ :

\n\n
gcc main.cpp -lstdc++ -o program_gcc_fixed\n
\n\n

Mais pourquoi réinventer la roue ? g++ le fait « prêt à l'emploi ».

\n\n

Et qu'en est-il de la compilation du C pur ?

\n\n

Ici, tout est symétrique. Si vous écrivez un programme en C et essayez de le compiler avec g++, il fonctionnera probablement. Mais g++ traitera le code comme du C++, ce qui signifie :

\n
    \n
  • Des vérifications de type plus strictes.
  • \n
  • Des règles différentes pour les conversions de type implicites.
  • \n
  • D'éventuels avertissements (warnings) erronés.
  • \n
\n\n

Exemple. Du code en C :

\n\n
#include <stdio.h>\nint main() {\n    char *s = malloc(100);\n    printf("Hello\\n");\n    free(s);\n    return 0;\n}\n
\n\n

En C, c'est normal. En C++, un cast explicite (char*)malloc(100) est nécessaire. g++ générera une erreur, tandis que gcc non. Conclusion : pour les projets C, utilisez gcc ; pour les projets C++, utilisez g++.

\n\n

Extensions de fichiers : comment le compilateur comprend-il le langage ?

\n\n

Une autre nuance importante : gcc et g++ regardent l'extension du fichier.

\n\n
    \n
  • .c — compilé comme du C.
  • \n
  • .cpp, .cc, .cxx — compilé comme du C++.
  • \n
\n\n

Si vous donnez à gcc un fichier avec l'extension .cpp, il comprendra qu'il s'agit de C++ et utilisera le bon frontal (compilateur de langage). Mais l'édition de liens restera toujours sans

Blogs

Book Recommendations