web-dev-qa-db-fra.com

Comment compiler C ++ avec le support de C ++ 11 dans un terminal Mac

Je voulais compiler le code source C++ 11 dans un terminal Mac, mais j'ai échoué. J'ai essayé g++ -std=c++11, g++ -std=c++0x, g++ -std=gnu++11 et g++ -std=gnu++0x mais rien n'a fonctionné. Terminal toujours lu unrecognized command line option. Toutefois, g++ -std=gnu et des choses comme ça ont bien fonctionné (bien sûr, le code source C++ 11 n'a pas pu passer).

Quelle option dois-je utiliser pour activer la prise en charge de C++ 11?

En passant, l'outil de ligne de commande que j'utilise est installé dans Xcode et je suis à peu près sûr qu'il est à jour.

65
4ae1e1

Comme d'autres l'ont fait remarquer, vous devriez utiliser clang++ plutôt que g++. En outre, vous devez utiliser la bibliothèque libc ++ à la place de la bibliothèque par défaut libstdc ++; La version incluse de libstdc ++ est assez ancienne et n'inclut donc pas les fonctionnalités de la bibliothèque C++ 11.

clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

Si vous n'avez pas installé les outils de ligne de commande pour Xcode, vous pouvez exécuter le compilateur et d'autres outils sans le faire en utilisant l'outil xcrun.

xcrun clang++ -std=c++11 -stdlib=libc++ -Weverything main.cpp

De même, si vous souhaitez désactiver un avertissement particulier, vous pouvez transmettre des indicateurs supplémentaires au compilateur. À la fin des messages d'avertissement, il vous indique l'indicateur le plus spécifique qui permettrait d'activer l'avertissement. Pour désactiver cet avertissement, vous préférez ajouter no- au nom de l'avertissement.

Par exemple, vous ne voulez probablement pas les avertissements de compatibilité c ++ 98. À la fin de ces avertissements, il affiche le drapeau -Wc++98-compat et pour les désactiver, vous passez -Wno-c++98-compat.

96
bames53

XCode utilise clang et clang++ lors de la compilation, pas g++ _ (en supposant que vous n'avez pas personnalisé les choses). Au lieu de cela, essayez:

$ cat t.cpp
#include <iostream>

int main()
{
    int* p = nullptr;
    std::cout << p << std::endl;
}
$ clang++ -std=c++11 -stdlib=libc++ t.cpp
$ ./a.out 
0x0

Merci à la réponse de bames53 pour avoir signalé que j'avais omis de jouer -stdlib=libc++.

Si vous voulez utiliser certaines extensions GNU (et aussi utiliser C++ 11), vous pouvez utiliser -std=gnu++11 au lieu de -std=c++11, qui activera le mode C++ 11 et conservera également les extensions GNU activées.

24
Cornstalks