Kompilowanie C ++ 11 za pomocą g ++

367

Próbuję zaktualizować mój kompilator C ++ do C ++ 11. Trochę przeszukałem i doszedłem do wniosku, że muszę użyć flagi -std=c++0xlub -std=gnu++0x, ale niewiele wiem o flagach. Czy ktoś może mi pomóc? (Używam Ubuntu 12.04.)

Oto błąd, który otrzymuję z kompilatora, gdy próbuję użyć biblioteki zawartej w C ++ 11 (tj. Tablicy):

#include <array>
#include <iostream>

int main()
{
    std::array<int, 3> arr = {2, 3, 5};
    ...
}

Ten plik wymaga obsługi kompilatora i biblioteki dla nadchodzącego standardu ISO C ++, C ++ 0x. Ta obsługa jest obecnie w fazie eksperymentalnej i musi być włączona z opcjami kompilatora -std = c ++ 0x lub -std = gnu ++ 0x.

Rontogiannis Aristofanis
źródło
5
W najnowszej wersji prawdopodobnie będziesz musiał użyć -std=c++11zamiast tego. Może jednak oba są dozwolone.
6
To pomija wiele kontekstów. Pokaż pełną wypróbowaną komendę (być może nawet przykładowy kod, który próbowałeś skompilować) i co faktycznie nie powiodło się.
KillianDS
4
@classdaknok_t: oba powinny być dozwolone, g++-4.6domyślnie także Ubuntu 12.04 jest dostarczane (które obsługuje tylko -std=c++0x)
KillianDS
3
Dodaj flagi zaraz po g++, np g++ -std=c++0x _filename_ && ./a.out.
n. „zaimki” m.
1
Przeszedłem przez ten post, szukając tytułowego komunikatu o błędzie. Pracuję nad projektem QMAKE, rozwiązaniem dla mnie było dodanie CONFIG + = c ++ 11 do pliku .pro.

Odpowiedzi:

529

Flagi (lub opcje kompilatora) to zwykłe argumenty wiersza poleceń przekazywane do pliku wykonywalnego kompilatora.

Zakładając, że wywołujesz g ++ z linii poleceń (terminal):

$ g++ -std=c++11 your_file.cpp -o your_program

lub

$ g++ -std=c++0x your_file.cpp -o your_program

jeśli powyższe nie działa.

Oskar N.
źródło
8
Nie zapomnij umieścić -Wall -gzaraz pog++
Basile Starynkevitch
7
@BasileStarynkevitch: Chciałbym również dodać -Werror, nie ma powodu, aby nie przy rozpoczynaniu projektu.
Matthieu M.
3
Lepsza obsługa C ++ 11 jest dyskusyjna, a lepsza diagnostyka nie wygląda obecnie znacznie lepiej (strona Clanga, która je opisuje, korzysta z GCC 4.2, który jest starożytny) gcc.gnu.org/wiki/ClangDiagnosticsComparison ;)
Jonathan Wakely
58
Czy ktoś wie, czy / kiedy kompilatory C ++ będą domyślnie obsługiwały standard C ++ 11, to znaczy bez flagi?
Dennis,
2
A jeśli jeszcze tego nie wiesz, w Visual C ++ wystarczy użyć VC11 (Visual Studio 2012) lub nowszej, aby mieć funkcje C ++ 11
gerrytan
44

Możesz sprawdzić swoje g++polecenie:

which g++
g++ --version

powie ci to, który dostawca obecnie wskazuje.

Aby przełączyć się na g++4.7 (zakładając, że zainstalowałeś go na swoim komputerze), uruchom:

sudo update-alternatives --config gcc

There are 2 choices for the alternative gcc (providing /usr/bin/gcc).

  Selection    Path              Priority   Status
------------------------------------------------------------
  0            /usr/bin/gcc-4.6   60        auto mode
  1            /usr/bin/gcc-4.6   60        manual mode
* 2            /usr/bin/gcc-4.7   40        manual mode

Następnie wybierz 2jako wybór (Moja maszyna wskazuje już na g++4.7, więc *)

Po zmianie kompilatora ponownie uruchom g++ --version aby sprawdzić, czy zmiana została poprawnie.

Teraz skompiluj swój program

g++ -std=c++11 your_file.cpp -o main
Harajyoti Das
źródło
Warto wspomnieć, że wersje takie jak g ++ 4.4 mogą być po prostu za stare, aby wykonać niektóre funkcje, dlatego konieczna jest aktualizacja. Aktualizacja będzie zależeć od twojego systemu i unikałbym metod samodzielnego kompilowania g ++ i zastępowania kompilatora systemu w celach informacyjnych
Colin D
13

Twoje ubuntu zdecydowanie ma wystarczająco nową wersję g ++. Flaga do użycia to -std=c++0x.

Michael Slade
źródło
Jak możesz to powiedzieć, że on używa Ubuntu? Po prostu ciekawy wiedzieć.
Shravan40,
22
@ Shravan40 OP wyraźnie mówi I'm using Ubuntu 12.04.w pytaniu.
Timothy Gu
10

Jeśli chcesz zachować rozszerzenia kompilatora GNU, użyj -std = gnu ++ 0x zamiast -std = c ++ 0x. Oto cytat ze strony podręcznika:

Kompilator może zaakceptować kilka podstawowych standardów, takich jak c89 lub c ++ 98, oraz dialekty GNU tych standardów, takie jak gnu89 lub gnu ++ 98. Określając standard podstawowy, kompilator zaakceptuje wszystkie programy zgodne z tym standardem oraz te, które używają rozszerzeń GNU, które mu nie zaprzeczają. Na przykład -std = c89 wyłącza niektóre funkcje GCC, które są niezgodne z ISO C90, takie jak słowa kluczowe „asm” i „typeof”, ale nie inne rozszerzenia GNU, które nie mają znaczenia w ISO C90, takie jak pominięcie średni termin wyrażenia „?:”. Z drugiej strony, poprzez określenie dialektu GNU standardu, wszystkie funkcje obsługujące kompilator są włączone, nawet jeśli cechy te zmieniają znaczenie standardu podstawowego, a niektóre ściśle zgodne programy mogą zostać odrzucone. Konkretny standard jest używany przez -edantic do określenia, które funkcje są rozszerzeniami GNU, biorąc pod uwagę tę wersję standardu. Na przykład-std = gnu89 -pedantic ostrzega o // komentarzach w stylu C ++, podczas gdy -std = gnu99 -pedantic nie.


źródło
Co ci to daje, oprócz ?:operatora binarnego ? Jedyne inne rozszerzenie, które przychodzi na myśl, wyrażenia struktury, jest zastępowane przez inicjalizację listy C ++ 11. W każdym razie ten cytat dotyczy głównie C, a nie C ++.
Potatoswatter
9

Możesz zapoznać się z poniższym linkiem dla którego funkcje są obsługiwane w konkretnej wersji kompilatora. Posiada wyczerpującą listę obsługi funkcji w kompilatorze. Wygląda na to, że GCC ściśle przestrzega standardu i implementuje przed jakimkolwiek innym kompilatorem.

Jeśli chodzi o twoje pytanie, możesz je skompilować

  1. g++ -std=c++11 dla C ++ 11
  2. g++ -std=c++14 dla C ++ 14
  3. g++ -std=c++17 dla C ++ 17
  4. g++ -std=c++2adla C ++ 20, chociaż wszystkie funkcje C ++ 20 nie są jeszcze obsługiwane, skorzystaj z tego łącza, aby uzyskać listę obsługiwanych funkcji w GCC.

Lista zmienia się dość szybko, miej oko na liście, jeśli czekasz na obsługę określonej funkcji.

yadhu
źródło