¿Cómo habilito C ++ 11 en gcc?


117

Utilizo gcc 4.8.1 de http://hpc.sourceforge.net en Mac OSX Mountain Lion. Estoy intentando compilar un programa C ++ que usa la to_stringfunción en <string>. Necesito usar la bandera -std=c++11cada vez:

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

¿Hay alguna forma de incluir esta bandera de forma predeterminada?


3
Utilice un Makefile e introdúzcalo CXXFLAGS.

Personalmente, he optado por un servicio de automatismo para compilar usando banderas como esta. Los Makefiles también son buenos, y luego, por supuesto, está XCode (o cualquier otro IDE).
Dave

Dev-C ++ y otros IDE tienen opciones de compilador donde puede configurarlo
boctulus

Respuestas:


90

H2CO3 tiene razón, puede usar un archivo MAKE con el conjunto CXXFLAGS con -std = c ++ 11 Un archivo MAKE es un archivo de texto simple con instrucciones sobre cómo compilar su programa. Cree un nuevo archivo llamado Makefile (con una M mayúscula). Para compilar automáticamente su código, simplemente escriba el comando make en una terminal. Puede que tenga que instalar make.

Aquí hay uno 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)

Asume que todos los archivos .cpp están en el mismo directorio que el archivo MAKE. Pero puede modificar fácilmente su archivo MAKE para admitir un src, incluir y construir directorios.

Editar : modifiqué el compilador de C ++ predeterminado, mi versión de g ++ no está actualizada. Con clang ++, este archivo MAKE funciona bien.


gracias Silouane y @ H2CO3 :) Debo aprender a trabajar con archivos MAKE
Guddu

1
@guddu: Aquí hay un tutorial que parece una introducción bastante completa. Entonces es posible que desee verificar las macros especiales
Silouane Gerin

1
Vale la pena señalar que la sintaxis estándar de Makefile requiere caracteres de tabulación, o dará errores crípticos e idiotas. Por eso utilizo gmake con RECIPEPREFIX como se muestra en la documentación . Los caracteres de tabulación son una abominación; utilizarlos nunca.
Parthian Shot

24

Como se mencionó anteriormente, en el caso de un proyecto, Makefileo de otro modo, este es un problema de configuración del proyecto, donde probablemente también necesitará especificar otros indicadores.

Pero, ¿qué pasa con los programas únicos, en los que normalmente escribirías g++ file.cpp && ./a.out?

Bueno, me gustaría mucho como para tener algún #pragmaentregar en al nivel de la fuente, o tal vez una extensión por defecto - por ejemplo .cxx, o .C11lo que sea, de disparo por defecto. Pero a día de hoy, no existe tal característica.

Pero, como probablemente esté trabajando en un entorno manual (es decir, shell), puede tener un alias en usted .bashrc(o lo que sea):

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

o, para los nuevos G ++ (y cuando quieras sentirte "real C ++ 11")

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

Incluso puede alias a g++sí mismo, si odia tanto C ++ 03;)


7

Creo que podrías hacerlo usando un archivo de especificaciones.

En MinGW puede ejecutar
gcc -dumpspecs> specs

En donde dice

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

Lo cambias a

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

Y luego colóquelo en
/ mingw / lib / gcc / mingw32 / <version> / specs

Estoy seguro de que podrías hacer lo mismo sin una compilación de MinGW. Sin embargo, no estoy seguro de dónde colocar el archivo de especificaciones.

La carpeta probablemente sea / gcc / lib / o / gcc /.


1
En este momento, es más fácil obtener una compilación de gcc-6, donde el valor predeterminado es C ++ 14.
Marc Glisse

En Linux, puede encontrar la ubicación ejecutando strace -f gcc your-sources-here 2>&1 | grep specs. En un sistema Debian (más antiguo), esto produce /usr/lib/gcc/i586-linux-gnu/4.9/specs. ¡Creé eso specscomo se describe en la respuesta (necesita sudo para moverlo allí en Linux) y funciona como un encanto! Gracias.
Adrian W.

0

Si está utilizando sublime, este código puede funcionar si lo agrega en la compilación como código para el sistema de compilación. Puede utilizar este enlace para obtener más información.

{
    "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}\""
        }
    ]
}
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.