Introduction : Le drame aux deux noms
\n\nSi 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é.
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.
Bref aperçu : qu'est-ce que GCC ?
\n\nGCC (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\nLa 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.
La principale différence : l'édition de liens des bibliothèques standard
\n\nImaginez 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\nEssayons de le compiler de deux manières :
\n\ngcc main.cpp -o program_gcc\ng++ main.cpp -o program_gpp\n\n\nRésultat :
\n- \n
g++— la compilation réussira. \n gcc— vous obtiendrez une erreur d'édition de liensundefined reference to `std::cout'. \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.
Bien sûr, vous pouvez forcer gcc à fonctionner avec le C++ manuellement, en ajoutant le drapeau -lstdc++ :
gcc main.cpp -lstdc++ -o program_gcc_fixed\n\n\nMais pourquoi réinventer la roue ? g++ le fait « prêt à l'emploi ».
Et qu'en est-il de la compilation du C pur ?
\n\nIci, 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
- 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
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\nEn 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++.
Extensions de fichiers : comment le compilateur comprend-il le langage ?
\n\nUne autre nuance importante : gcc et g++ regardent l'extension du fichier.
- \n
.c— compilé comme du C. \n .cpp,.cc,.cxx— compilé comme du C++. \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
Lire aussi
Injection de Dépendances en Java : de A à Z en pratique
Optimisation des performances des applications PHP : guide pour débutants
JavaScript à partir de zéro : par où commencer en 2025 — guide pour débutants
Combien d'octets font int et long en C++ ? La norme répond de manière inattendue
PHP pour la programmation système : un outil inattendu dans l'arsenal du développeur