Jak włączyć C ++ 11 w gcc?

117

Używam gcc 4.8.1 z http://hpc.sourceforge.net na Mac OSX Mountain Lion. Próbuję skompilować program C ++, który używa rozszerzeniato_string funkcji w <string>. Za -std=c++11każdym razem muszę używać flagi :

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

Czy istnieje sposób na włączenie tej flagi domyślnie?

Guddu
źródło
3
Użyj pliku Makefile i umieść go CXXFLAGS.
Osobiście skorzystałem z usługi automatu, aby kompilować przy użyciu takich flag. Pliki Makefile są również dobre, a poza tym jest oczywiście XCode (lub inne IDE).
Dave
Dev-C ++ i inne IDE mają opcje kompilatora, w których można je ustawić
boctulus

Odpowiedzi:

90

H2CO3 ma rację, możesz użyć makefile z zestawem CXXFLAGS z opcją -std = c ++ 11 Makefile to prosty plik tekstowy z instrukcjami kompilacji programu. Utwórz nowy plik o nazwie Makefile (z dużej litery M). Aby automatycznie skompilować kod, po prostu wpisz polecenie make w terminalu. Konieczne może być zainstalowanie make.

Oto prosty:

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)

Zakłada, że ​​wszystkie pliki .cpp znajdują się w tym samym katalogu, co plik makefile. Ale możesz łatwo dostosować swój plik makefile, aby obsługiwał katalogi src, dołączania i budowania.

Edycja : zmodyfikowałem domyślny kompilator C ++, moja wersja g ++ nie jest aktualna. Z clang ++ ten plik makefile działa dobrze.

Silouane Gerin
źródło
dzięki Silouane i @ H2CO3 :) Powinienem nauczyć się pracować z makefiles
Guddu
1
@guddu: Oto samouczek, który wydaje się raczej kompletnym wprowadzeniem. W takim razie możesz chcieć sprawdzić specjalne makra
Silouane Gerin
1
Warto zauważyć, że standardowa składnia Makefile wymaga znaków tabulacji lub będzie powodować tajemnicze, idiotyczne błędy. Dlatego używam gmake z RECIPEPREFIX, jak pokazano w dokumentacji . Znaki tabulacji są obrzydliwością; nigdy ich nie używaj.
Parthian Shot
24

Jak już wspomniano - w przypadku projektu, Makefile lub w innym przypadku jest to problem z konfiguracją projektu, w którym prawdopodobnie będziesz musiał określić również inne flagi.

Ale co z jednorazowymi programami, w których normalnie byś po prostu pisał g++ file.cpp && ./a.out?

Cóż, bardzo chciałbym, aby niektóre #pragmawłączały się na poziomie źródła, a może domyślne rozszerzenie - powiedzmy .cxxlub.C11 czy coś, spust go domyślnie. Ale na dzień dzisiejszy nie ma takiej funkcji.

Ale ponieważ prawdopodobnie pracujesz w środowisku ręcznym (np. Powłoce), możesz po prostu mieć w sobie alias .bashrc(lub cokolwiek):

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

lub w przypadku nowszego G ++ (i gdy chcesz poczuć się jak „prawdziwy C ++ 11”)

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

Możesz nawet alias do g++siebie samego, jeśli tak bardzo nienawidzisz C ++ 03;)

Tomasz Gandor
źródło
7

Myślę, że możesz to zrobić za pomocą pliku specyfikacji.

W MinGW można uruchomić
gcc -dumpspecs> specs

Gdzie jest napisane

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

Zmień to na

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

Następnie umieść go w
/ mingw / lib / gcc / mingw32 / <version> / specs

Jestem pewien, że możesz zrobić to samo bez kompilacji MinGW. Nie wiem jednak, gdzie umieścić plik specyfikacji.

Folder to prawdopodobnie / gcc / lib / lub / gcc /.

DrowsySaturn
źródło
1
W tym momencie łatwiej jest uzyskać kompilację gcc-6, gdzie domyślną wersją jest C ++ 14.
Marc Glisse
W systemie Linux możesz znaleźć lokalizację, uruchamiając strace -f gcc your-sources-here 2>&1 | grep specs. Na jednym (starszym) systemie Debian daje to wynik /usr/lib/gcc/i586-linux-gnu/4.9/specs. Utworzono to specszgodnie z opisem w odpowiedzi (wymaga sudo, aby przenieść to tam pod Linuksem) i działa jak urok! Dzięki.
Adrian W,
0

Jeśli używasz sublime, ten kod może działać, jeśli dodasz go w kompilacji jako kod do budowania systemu. Możesz skorzystać z tego łącza, aby uzyskać więcej informacji.

{
    "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
źródło