Comment activer C ++ 11 dans gcc?


117

J'utilise gcc 4.8.1 de http://hpc.sourceforge.net sur Mac OSX Mountain Lion. J'essaye de compiler un programme C ++ qui utilise la to_stringfonction dans <string>. J'ai besoin d'utiliser le drapeau à -std=c++11chaque fois:

g++ -std=c++11 -o testcode1 code1.cpp

Existe-t-il un moyen d'inclure cet indicateur par défaut?


3
Utilisez un Makefile et placez-le CXXFLAGS.

Personnellement, je suis allé avec un service d'automatisme pour compiler en utilisant des drapeaux comme celui-ci. Les makefiles sont également bons, et bien sûr il y a XCode (ou tout autre IDE).
Dave

Dev-C ++ et d'autres IDE ont des options de compilateur où vous pouvez le définir
boctulus

Réponses:


90

H2CO3 a raison, vous pouvez utiliser un makefile avec le CXXFLAGS défini avec -std = c ++ 11 Un makefile est un simple fichier texte avec des instructions sur la façon de compiler votre programme. Créez un nouveau fichier nommé Makefile (avec un M majuscule). Pour compiler automatiquement votre code, tapez simplement la commande make dans un terminal. Vous devrez peut-être installer make.

En voici une simple:

CXX=clang++
CXXFLAGS=-g -std=c++11 -Wall -pedantic
BIN=prog

SRC=$(wildcard *.cpp)
OBJ=$(SRC:%.cpp=%.o)

all: $(OBJ)
    $(CXX) -o $(BIN) $^

%.o: %.c
    $(CXX) $@ -c $<

clean:
    rm -f *.o
    rm $(BIN)

Il suppose que tous les fichiers .cpp sont dans le même répertoire que le makefile. Mais vous pouvez facilement modifier votre makefile pour prendre en charge un répertoire src, include et build.

Edit : J'ai modifié le compilateur c ++ par défaut, ma version de g ++ n'est pas à jour. Avec clang ++, ce makefile fonctionne très bien.


merci Silouane et @ H2CO3 :) je devrais apprendre à travailler avec des makefiles
Guddu

1
@guddu: Voici un tutoriel qui semble une introduction assez complète. Ensuite, vous voudrez peut-être vérifier les macros spéciales
Silouane Gerin

1
Il convient de noter que la syntaxe Makefile standard nécessite des caractères de tabulation, sinon elle donnera des erreurs cryptiques et idiotes. C'est pourquoi j'utilise gmake avec RECIPEPREFIX comme indiqué dans la documentation . Les caractères de tabulation sont une abomination; ne les utilisez jamais.
Tir parthe du

24

Comme mentionné précédemment - dans le cas d'un projet, Makefileou autre, il s'agit d'un problème de configuration de projet, où vous devrez probablement spécifier d'autres indicateurs également.

Mais qu'en est-il des programmes ponctuels, où vous écririez normalement g++ file.cpp && ./a.out?

Eh bien, je voudrais bien avoir un peu de #pragmase replier sur au niveau de la source, ou peut - être une extension par défaut - par exemple .cxxou .C11ou autre, déclencheur par défaut. Mais à partir d'aujourd'hui, une telle fonctionnalité n'existe pas.

Mais, comme vous travaillez probablement dans un environnement manuel (ex. Shell), vous pouvez simplement avoir un alias en vous .bashrc(ou autre):

alias g++11="g++ -std=c++0x"

ou, pour le G ++ plus récent (et quand vous voulez vous sentir "vrai C ++ 11")

alias g++11="g++ -std=c++11"

Vous pouvez même g++vous aliaser, si vous détestez autant le C ++ 03;)


7

Je pense que vous pouvez le faire en utilisant un fichier de spécifications.

Sous MinGW, vous pouvez exécuter
gcc -dumpspecs> specs

Où il est dit

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT}

Vous le changez en

*cpp:
%{posix:-D_POSIX_SOURCE} %{mthreads:-D_MT} -std=c++11

Et puis placez-le dans
/ mingw / lib / gcc / mingw32 / <version> / specs

Je suis sûr que vous pourriez faire la même chose sans une version MinGW. Cependant, je ne sais pas où placer le fichier de spécifications.

Le dossier est probablement / gcc / lib / ou / gcc /.


1
À ce stade, il est plus facile d'obtenir une version de gcc-6, où la valeur par défaut est C ++ 14.
Marc Glisse

Sous Linux, vous pouvez trouver l'emplacement en exécutant strace -f gcc your-sources-here 2>&1 | grep specs. Sur un (plus ancien) système Debian, cela donne /usr/lib/gcc/i586-linux-gnu/4.9/specs. Créé specscomme décrit dans la réponse (nécessite sudo pour le déplacer sous Linux) et fonctionne comme un charme! Merci.
Adrian W

0

Si vous utilisez sublime, ce code peut fonctionner si vous l'ajoutez dans la construction en tant que code pour le système de construction. Vous pouvez utiliser ce lien pour plus d'informations.

{
    "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\"",
    "file_regex": "^(..[^:]*):([0-9]+):?([0-9]+)?:? (.*)$",
    "working_dir": "${file_path}",
    "selector": "source.c, source.c++",

    "variants":
    [
        {
            "name": "Run",
            "shell_cmd": "g++ \"${file}\" -std=c++1y -o \"${file_path}/${file_base_name}\" && \"${file_path}/${file_base_name}\""
        }
    ]
}
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.