Jak włączyć C ++ 11 w Qt Creator?


167

Tytuł jest dość samoopisowy. Pobrałem Qt Creator 2.7.0 i próbuję skompilować podstawowy kod C ++ 11:

int my_array[5] = {1, 2, 3, 4, 5};
for(int &x : my_array)
{
  x *= 2;
}

Otrzymuję następujący błąd:

range based for loops are not allowed in c++ 98 mode

Jednak zgodnie z tym artykułem ta wersja Qt Creator obsługuje C ++ 11. Jak więc to włączyć?


3
Qt Creator nie jest kompilatorem. Kiedy czytasz, że „Qt Creator obsługuje C ++ 11”, oznacza to, że mechanizm uzupełniania kodu (w tym przypadku Clang) obsługuje składnię C ++ 11.
cmannett85

@ cmannett85 Qt Creator nadal nie używa Clang jako parsera składni C ++. Były wysiłki, ale API Clanga i ogólna wydajność tego rozwiązania opóźniły to. Obecne prace w tym kierunku znajdują się tutaj .
rubenvb

Odpowiedzi:


261

Według tej strony dodaj

CONFIG += c++11

do pliku .pro (zobacz na dole tej strony internetowej). Wymaga Qt 5.


Inne odpowiedzi, sugerujące

QMAKE_CXXFLAGS += -std=c++11(lub QMAKE_CXXFLAGS += -std=c++0x)

działa również z Qt 4.8 i gcc / clang.


4
Anonimowe głosy przeciw nikomu nie pomagają. Co jest nie tak z odpowiedzią?
Ali

Problem polegał na tym, że nie mogłem usunąć Twojej zduplikowanej / niekompletnej odpowiedzi, jedyne, co mogłem zrobić, to przegłosować. Teraz, gdy zredagowałeś go, aby był bardziej reprezentacyjny, cieszę się tylko z negatywnego głosu.
nurettin

9
@nurettin Dzięki za informację zwrotną. Jeśli dokładnie przeanalizujesz historię edycji odpowiedzi (moją i innych), zobaczysz, że moja pierwotna odpowiedź nie była duplikatem; w rzeczywistości była to druga odpowiedź, która bezwstydnie ukradła część mojej odpowiedzi, przez co moja odpowiedź wyglądała jak duplikat. W tym roku pojawiły się jeszcze dwie zduplikowane odpowiedzi. Sprawdź to sam w historii edycji. Biorąc pod uwagę te informacje, czy rozważyłbyś ponownie swój głos przeciw?
Ali

3
@Troyseph Oto moje rozumienie sytuacji. Zakładam, że używasz gcc. Jeśli wersja gcc obsługuje -std=c++11, to powinna również obsługiwać -std=c++0xflagę (przestarzała) , a obie flagi powinny mieć identyczne efekty (co najwyraźniej nie ma miejsca na twoim komputerze). Jeśli kompilator obsługuje -std=c++0x, nie oznacza to, że rozumie -std=c++11. Dlatego wybranie -std=c++0xjako domyślnego trybu zgodności z C ++ 11 jest rozsądnym wyborem. Na moim komputerze, przynajmniej według strony człowieka , -std=c++0xi -std=c++11są identyczne.
Ali

1
@Troyseph Prawdą jest, że byłoby lepiej, -std=c++11gdyby kompilator go obsługiwał, a Qt mógłby być na tyle sprytny, aby to zrobić. Cóż, jeśli ten problem cię tak boli, możesz zgłosić błąd ...
Ali

32

Dodaj to do swojego pliku .pro

QMAKE_CXXFLAGS += -std=c++11

lub

CONFIG += c++11

18

Jako alternatywę dla załatwienia obu przypadków, do których odnosi się doskonała odpowiedź Ali, zwykle dodam

# With C++11 support
greaterThan(QT_MAJOR_VERSION, 4){    
CONFIG += c++11
} else {
QMAKE_CXXFLAGS += -std=c++0x
}

do moich plików projektu. Może to być przydatne, gdy tak naprawdę nie zależy ci na tym, której wersji Qt używają ludzie w twoim zespole, ale chcesz, aby w każdym przypadku włączono C ++ 11.


Powinno to być -std = c ++ 11
Predrag Manojlovic

8

dodaj do swojego pliku qmake

QMAKE_CXXFLAGS+= -std=c++11
QMAKE_LFLAGS +=  -std=c++11

4

Jeśli używasz wcześniejszej wersji QT (<5), spróbuj tego

QMAKE_CXXFLAGS += -std=c++0x

1

Jedyne miejsce, w którym udało mi się to udać, to wyszukiwanie w:

... \ Qt \ {5,9; lub Twoja wersja} \ mingw {53_32; lub Twoja wersja} \ mkspecs \ win32-g ++ \ qmake.conf:

Następnie na linii:

QMAKE_CFLAGS           += -fno-keep-inline-dllexport

Edytować :

QMAKE_CFLAGS           += -fno-keep-inline-dllexport -std=c++11
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.