Como eu habilito o C ++ 11 no gcc?

117

Eu uso o gcc 4.8.1 de http://hpc.sourceforge.net no Mac OSX Mountain Lion. Estou tentando compilar um programa C ++ que usa a to_stringfunção em <string>. Preciso usar a bandeira -std=c++11todas as vezes:

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

Existe uma maneira de incluir este sinalizador por padrão?

Guddu
fonte
3
Use um Makefile e coloque-o CXXFLAGS.
Pessoalmente, usei um serviço de automação para compilar usando sinalizadores como este. Makefiles também são bons e, claro, há o XCode (ou qualquer outro IDE).
Dave
Dev-C ++ e outros IDEs têm opções de compilador onde você pode configurá-lo
boctulus

Respostas:

90

H2CO3 está certo, você pode usar um makefile com o CXXFLAGS definido com -std = c ++ 11 Um makefile é um arquivo de texto simples com instruções sobre como compilar seu programa. Crie um novo arquivo chamado Makefile (com um M maiúsculo). Para compilar seu código automaticamente, basta digitar o comando make em um terminal. Você pode ter que instalar o make.

Aqui está um simples:

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)

Ele assume que todos os arquivos .cpp estão no mesmo diretório que o makefile. Mas você pode facilmente ajustar seu makefile para suportar um src, incluir e construir diretórios.

Editar : eu modifiquei o compilador c ++ padrão, minha versão do g ++ não está atualizada. Com o clang ++, este makefile funciona bem.

Silouane Gerin
fonte
obrigado Silouane e @ H2CO3 :) devo aprender a trabalhar com makefiles
Guddu
1
@guddu: Aqui está um tutorial que parece uma introdução bastante completa. Então você pode querer verificar as macros especiais
Silouane Gerin
1
Vale a pena notar que a sintaxe Makefile padrão requer caracteres de tabulação, ou fornecerá erros crípticos e idiotas. É por isso que uso o gmake com RECIPEPREFIX, conforme mostrado na documentação . Os caracteres de tabulação são uma abominação; use-os nunca.
Parthian Shot de
24

Conforme mencionado anteriormente - no caso de um projeto, Makefileou não, este é um problema de configuração do projeto, onde provavelmente você também precisará especificar outros sinalizadores.

Mas e os programas únicos, onde normalmente você apenas escreveria g++ file.cpp && ./a.out?

Bem, eu gostaria muito de ter alguns #pragmapara ativar no nível de origem, ou talvez uma extensão padrão - digamos .cxxou .C11ou o que quer que seja, acioná-lo por padrão. Mas a partir de hoje, esse recurso não existe.

Mas, como você provavelmente está trabalhando em um ambiente manual (ou seja, shell), você pode apenas ter um alias em você .bashrc(ou qualquer outro):

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

ou, para G ++ mais recente (e quando você quiser se sentir "real C ++ 11")

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

Você pode até mesmo usar um alias para g++si mesmo, se você odeia tanto C ++ 03;)

Tomasz Gandor
fonte
7

Acho que você poderia fazer isso usando um arquivo de especificações.

No MinGW, você pode executar
gcc -dumpspecs> specs

Onde diz

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

Você muda para

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

E então coloque-o em
/ mingw / lib / gcc / mingw32 / <versão> / specs

Tenho certeza que você poderia fazer o mesmo sem uma compilação MinGW. Não tenho certeza de onde colocar o arquivo de especificações embora.

A pasta provavelmente é / gcc / lib / ou / gcc /.

DrowsySaturn
fonte
1
Neste ponto, é mais fácil obter uma versão do gcc-6, onde o padrão é C ++ 14.
Marc Glisse
No Linux, você pode encontrar o local executando strace -f gcc your-sources-here 2>&1 | grep specs. Em um sistema Debian (mais antigo), isso produz /usr/lib/gcc/i586-linux-gnu/4.9/specs. Criou isso specsconforme descrito na resposta (precisa de sudo para movê-lo para lá no Linux) e funciona perfeitamente! Obrigado.
Adrian W
0

Se você estiver usando sublime, este código pode funcionar se você adicioná-lo no build como código para o sistema de construção. Você pode usar este link para mais informações.

{
    "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}\""
        }
    ]
}
Abhilash Kumar Trivedi
fonte