Come abilito C ++ 11 in gcc?


117

Uso gcc 4.8.1 da http://hpc.sourceforge.net su Mac OSX Mountain Lion. Sto cercando di compilare un programma C ++ che utilizza la to_stringfunzione in <string>. Devo usare la bandiera -std=c++11ogni volta:

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

C'è un modo per includere questo flag per impostazione predefinita?


3
Usa un Makefile e inseriscilo CXXFLAGS.

Personalmente sono andato con un servizio di automazione per compilare usando flag come questo. Anche i makefile sono buoni, e poi ovviamente c'è XCode (o qualsiasi altro IDE).
Dave

Dev-C ++ e altri IDE hanno opzioni del compilatore in cui è possibile impostarlo
boctulus

Risposte:


90

H2CO3 ha ragione, puoi usare un makefile con il CXXFLAGS impostato con -std = c ++ 11 Un makefile è un semplice file di testo con le istruzioni su come compilare il tuo programma. Crea un nuovo file chiamato Makefile (con la M maiuscola). Per compilare automaticamente il codice basta digitare il comando make in un terminale. Potrebbe essere necessario installare make.

Eccone uno semplice:

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)

Si presume che tutti i file .cpp si trovino nella stessa directory del makefile. Ma puoi facilmente modificare il tuo makefile per supportare un src, includere e creare directory.

Modifica : ho modificato il compilatore c ++ predefinito, la mia versione di g ++ non è aggiornata. Con clang ++ questo makefile funziona bene.


grazie Silouane e @ H2CO3 :) dovrei imparare a lavorare con i makefile
Guddu

1
@guddu: ecco un tutorial che sembra un'introduzione piuttosto completa. Quindi potresti voler controllare le macro speciali
Silouane Gerin

1
Vale la pena notare che la sintassi standard del Makefile richiede caratteri di tabulazione, altrimenti darà errori criptici e idioti. Ecco perché utilizzo gmake con RECIPEPREFIX come mostrato nella documentazione . I caratteri di tabulazione sono un abominio; non usarli mai.
Parthian Shot

24

Come accennato in precedenza, in caso di progetto Makefileo altro, si tratta di un problema di configurazione del progetto, in cui è probabile che sia necessario specificare anche altri flag.

Ma per quanto riguarda i programmi una tantum, dove normalmente scriveresti solo g++ file.cpp && ./a.out?

Beh, vorrei tanto come avere un po ' #pragmaa girare in su a livello sorgente, o forse un estensione di default - per esempio .cxxo di .C11o qualsiasi altra cosa, di attivazione di default. Ma ad oggi, non esiste tale caratteristica.

Ma, poiché probabilmente stai lavorando in un ambiente manuale (cioè shell), puoi semplicemente avere un alias in te .bashrc(o qualsiasi altra cosa):

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

oppure, per il G ++ più recente (e quando vuoi sentirti "vero C ++ 11")

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

Puoi persino creare un alias per g++se stesso, se odi così tanto C ++ 03;)


7

Penso che potresti farlo usando un file delle specifiche.

Sotto MinGW potresti eseguire
gcc -dumpspecs> specs

Dove dice

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

Lo cambi in

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

E poi posizionalo in
/ mingw / lib / gcc / mingw32 / <version> / specs

Sono sicuro che potresti fare lo stesso senza una build MinGW. Tuttavia, non sono sicuro di dove posizionare il file delle specifiche.

La cartella è probabilmente / gcc / lib / o / gcc /.


1
A questo punto, è più facile ottenere una build di gcc-6, dove l'impostazione predefinita è C ++ 14.
Marc Glisse

Sotto Linux, puoi trovare la posizione eseguendo strace -f gcc your-sources-here 2>&1 | grep specs. Su un sistema Debian (più vecchio), questo produce /usr/lib/gcc/i586-linux-gnu/4.9/specs. Creato specscome descritto nella risposta (necessita di sudo per spostarlo lì sotto Linux) e funziona a meraviglia! Grazie.
Adrian W

0

Se stai usando sublime, questo codice potrebbe funzionare se lo aggiungi in build come codice per il sistema di costruzione. È possibile utilizzare questo collegamento per ulteriori informazioni.

{
    "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}\""
        }
    ]
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.