Wie aktiviere ich C ++ 11 in gcc?

117

Ich verwende gcc 4.8.1 von http://hpc.sourceforge.net unter Mac OSX Mountain Lion. Ich versuche ein C ++ - Programm zu kompilieren, das die to_stringFunktion in verwendet <string>. Ich muss die Flagge -std=c++11jedes Mal benutzen :

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

Gibt es eine Möglichkeit, dieses Flag standardmäßig einzuschließen?

Guddu
quelle
3
Verwenden Sie ein Makefile und legen Sie es ein CXXFLAGS.
Persönlich bin ich mit einem Automator-Service gegangen, um mit solchen Flags zu kompilieren. Makefiles sind auch gut, und dann gibt es natürlich XCode (oder eine andere IDE).
Dave
Dev-C ++ und andere IDEs haben Compiler-Optionen, wo Sie es einstellen können
Boctulus

Antworten:

90

H2CO3 ist richtig, Sie können ein Makefile mit dem mit -std = c ++ 11 festgelegten CXXFLAGS verwenden. Ein Makefile ist eine einfache Textdatei mit Anweisungen zum Kompilieren Ihres Programms. Erstellen Sie eine neue Datei mit dem Namen Makefile (mit einem Großbuchstaben M). Um Ihren Code automatisch zu kompilieren, geben Sie einfach den Befehl make in ein Terminal ein. Möglicherweise müssen Sie make installieren.

Hier ist eine einfache:

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)

Es wird davon ausgegangen, dass sich alle CPP-Dateien im selben Verzeichnis wie das Makefile befinden. Sie können Ihr Makefile jedoch problemlos optimieren, um eine src zu unterstützen, Verzeichnisse einzuschließen und zu erstellen.

Bearbeiten : Ich habe den Standard-C ++ - Compiler geändert, meine Version von g ++ ist nicht aktuell. Mit clang ++ funktioniert dieses Makefile einwandfrei.

Silouane Gerin
quelle
danke Silouane und @ H2CO3 :) Ich sollte lernen, mit Makefiles zu arbeiten
Guddu
1
@guddu: Hier ist ein Tutorial , das eine ziemlich vollständige Einführung zu sein scheint. Dann möchten Sie vielleicht die speziellen Makros
Silouane Gerin
1
Es ist erwähnenswert, dass die Standard-Makefile-Syntax Tabulatorzeichen erfordert oder kryptische, idiotische Fehler verursacht. Aus diesem Grund verwende ich gmake mit RECIPEPREFIX, wie in der Dokumentation gezeigt . Tabulatorzeichen sind ein Greuel; benutze sie niemals.
Parthian Shot
24

Wie bereits erwähnt - im Falle eines Projekts Makefileoder auf andere Weise handelt es sich um ein Projektkonfigurationsproblem, bei dem Sie wahrscheinlich auch andere Flags angeben müssen.

Aber was ist mit einmaligen Programmen, bei denen Sie normalerweise nur schreiben würden g++ file.cpp && ./a.out?

Nun, ich würde viel wie einige haben #pragmaan der Quelle Ebene zu drehen in auf, oder vielleicht eine Standarderweiterung - sagen .cxxoder .C11oder was auch immer, Trigger es standardmäßig. Aber bis heute gibt es keine solche Funktion.

Da Sie wahrscheinlich in einer manuellen Umgebung (dh einer Shell) arbeiten, können Sie einfach einen Alias ​​in sich haben .bashrc(oder was auch immer):

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

oder für neueres G ++ (und wenn Sie "echtes C ++ 11" fühlen möchten)

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

Sie können sogar einen Alias ​​für g++sich selbst erstellen , wenn Sie C ++ 03 so sehr hassen;)

Tomasz Gandor
quelle
7

Ich denke, Sie könnten es mit einer Spezifikationsdatei tun.

Unter MinGW können Sie
gcc -dumpspecs> specs ausführen

Wo steht

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

Sie ändern es in

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

Und platzieren Sie es dann in
/ mingw / lib / gcc / mingw32 / <Version> / specs

Ich bin sicher, Sie könnten dasselbe ohne einen MinGW-Build tun. Ich bin mir nicht sicher, wo ich die Spezifikationsdatei ablegen soll.

Der Ordner ist wahrscheinlich entweder / gcc / lib / oder / gcc /.

DrowsySaturn
quelle
1
Zu diesem Zeitpunkt ist es einfacher, einen Build von gcc-6 zu erhalten, wobei der Standard C ++ 14 ist.
Marc Glisse
Unter Linux können Sie den Speicherort finden, indem Sie ausführen strace -f gcc your-sources-here 2>&1 | grep specs. Auf einem (älteren) Debian-System ergibt sich dies /usr/lib/gcc/i586-linux-gnu/4.9/specs. Erstellt das specswie in der Antwort beschrieben (benötigt sudo, um es unter Linux dorthin zu verschieben) und funktioniert wie ein Zauber! Vielen Dank.
Adrian W
0

Wenn Sie sublime verwenden, funktioniert dieser Code möglicherweise, wenn Sie ihn in Build als Code für das Build-System hinzufügen. Sie können diesen Link für weitere Informationen verwenden.

{
    "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
quelle