web-dev-qa-db-fra.com

Quand est-il nécessaire d'utiliser le drapeau -stdlib = libstdc ++?

Quand faut-il utiliser le drapeau -stdlib=libstdc++ pour le compilateur et l'éditeur de liens lors de la compilation avec gcc?

Le compilateur utilise-t-il automatiquement libstdc ++?

J'utilise gcc4.8.2 sur Ubuntu 13.10 et j'aimerais utiliser le standard c ++ 11. Je passe déjà -std=c++11 au compilateur.

44
Raymond Valdes

Sous Linux: En général, toutes les distributions linux couramment disponibles utiliseront libstdc ++ par défaut, et toutes les versions modernes de GCC sont livrées avec un libstdc ++ qui prend en charge C++ 11. Si vous voulez compiler le code c ++ 11 ici, utilisez l’un des suivants:

  • g++ -std=c++11 input.cxx -o a.out
  • g++ -std=gnu++11 input.cxx -o a.out

sur OS X avant Mavericks: g++ était en fait un alias pour clang++ et l'ancienne version de libstdc ++ d'Apple étaient la version par défaut. Vous pouvez utiliser libc ++ (qui inclut le support de la bibliothèque c ++ 11) en passant -stdlib=libc++. Si vous voulez compiler le code c ++ 11 ici, utilisez l’un des suivants:

  • g++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • g++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=c++11 -stdlib=libc++ input.cxx -o a.out
  • clang++ -std=gnu++11 -stdlib=libc++ input.cxx -o a.out

sur OS X depuis Mavericks: libc ++ est la valeur par défaut. Vous pouvez utiliser l'ancienne version d'Apple de libstdc ++ (qui n'inclut pas le support de la bibliothèque c ++ 11) en transmettant -stdlib=libstdc++

  • clang++ -std=c++11 input.cxx -o a.out
  • clang++ -std=gnu++11 input.cxx -o a.out
74
Bill Lynch

Quand est-il nécessaire d'utiliser le drapeau -stdlib=libstdc++ Pour le compilateur et l'éditeur de liens lors de la compilation avec gcc?

Réponse courte: jamais

Réponse plus longue: -stdlib Est un drapeau Clang et ne fonctionnera avec aucune version de GCC jamais publiée. Sur Mac OS X, les commandes gcc et g++ Sont en réalité des alias pour Clang not GCC, et la version de libstdc ++ que Apple = ships est ancien (circa 2008), bien entendu, il ne prend pas en charge C++ 11. Cela signifie que, sous OS X, lorsque Clang prétend prétendre être GCC, vous pouvez utiliser -stdlib=libc++ Pour sélectionner la nouvelle bibliothèque de Clang compatible C++ 11, ou vous pouvez utiliser -stdlib=libstdc++ Pour sélectionner la version antique pré-C++ 11 de libstdc ++ qui appartient à un musée. Linux gcc et g++ Sont en réalité GCC pas Clang, et l'option -stdlib Ne fonctionnera pas du tout.

Le compilateur utilise-t-il automatiquement libstdc ++?

Oui, GCC utilise toujours libstdc ++ sauf si vous lui indiquez d'utiliser la bibliothèque standard non avec l'option -nostdlib (Auquel cas vous devez soit éviter d'utiliser les fonctions de la bibliothèque standard, soit utiliser -I Et -L Et -l Pour le diriger vers un autre jeu de fichiers d'en-tête et de bibliothèque).

J'utilise gcc4.8.2 sur Ubuntu 13.10 et j'aimerais utiliser le standard c ++ 11. Je passe déjà -std=c++11 Au compilateur.

Vous n'avez rien d'autre à faire. GCC est livré avec sa propre implémentation de la bibliothèque standard C++ (libstdc ++) qui a été développée et testée parallèlement à GCC afin que la version de GCC et la version de libstdc ++ soient compatibles à 100%. Si vous compilez avec -std=c++11, Les fonctionnalités C++ 11 du compilateur g++ Sont activées, ainsi que les fonctionnalités C++ 11 des en-têtes libstdc ++.

15
Jonathan Wakely

Le compilateur utilise automatiquement libstdc ++, si vous utilisez l'interface g ++, pas l'interface gcc.

6
Torsten Robitzki