Làm cách nào để bật C ++ 11 trong Qt Creator?


167

Tiêu đề là khá tự mô tả. Tôi đã tải xuống Qt Creator 2.7.0 và tôi đang cố gắng biên dịch một số mã C ++ 11 cơ bản:

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

Tôi đang nhận được lỗi sau:

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

Tuy nhiên, theo bài viết này, phiên bản Qt Creator này hỗ trợ C ++ 11. Vì vậy, làm thế nào để tôi kích hoạt nó?


3
Qt Creator không phải là trình biên dịch. Khi bạn đọc rằng "Qt Creator hỗ trợ C ++ 11", điều đó có nghĩa là công cụ hoàn tất mã (Clang trong trường hợp này) hỗ trợ cú pháp C ++ 11.
cmannett85

@ cmannett85 Qt Creator vẫn không sử dụng Clang làm trình phân tích cú pháp C ++. Đã có những nỗ lực, nhưng API của Clang và hiệu suất chung của giải pháp này đã trì hoãn việc này. Công việc hiện tại theo hướng này được đặt ở đây .
rubenvb

Câu trả lời:


261

Theo trang web này thêm

CONFIG += c++11

vào tệp .pro của bạn (xem ở cuối trang web đó). Nó đòi hỏi Qt 5.


Các câu trả lời khác, gợi ý

QMAKE_CXXFLAGS += -std=c++11(hoặc QMAKE_CXXFLAGS += -std=c++0x)

cũng hoạt động với Qt 4.8 và gcc / clang.


4
Downvote ẩn danh không giúp đỡ bất cứ ai. Có gì sai với câu trả lời?
Ali

Vấn đề là, tôi không thể xóa câu trả lời trùng lặp / không đầy đủ của bạn, tất cả những gì tôi có thể làm là hạ thấp nó. Bây giờ bạn đã chỉnh sửa nó để làm cho nó dễ trình bày hơn, tôi hài lòng với chỉ downvote.
Nurettin

9
@nurettin Cảm ơn bạn đã phản hồi. Nếu bạn kiểm tra cẩn thận lịch sử chỉnh sửa của các câu trả lời (của tôi và của những người khác), bạn sẽ thấy rằng câu trả lời ban đầu của tôi không phải là một bản sao; đó thực sự là câu trả lời khác đã đánh cắp một phần câu trả lời của tôi, khiến câu trả lời của tôi trông giống như một bản sao. Sau đó, hai câu trả lời trùng lặp xuất hiện trong năm nay. Kiểm tra nó cho chính mình trong lịch sử chỉnh sửa. Đưa ra thông tin này, bạn sẽ xem xét lại downvote của bạn?
Ali

3
@Troyseph Đây là sự hiểu biết của tôi về tình hình. Tôi giả sử rằng bạn đang sử dụng gcc. Nếu một phiên bản của gcc hỗ trợ -std=c++11, thì nó cũng sẽ hỗ trợ -std=c++0xcờ (không dùng nữa) và cả hai cờ được cho là có hiệu ứng giống hệt nhau (dường như không phải là trường hợp trên máy của bạn). Nếu một trình biên dịch hỗ trợ -std=c++0x, điều đó không có nghĩa là nó hiểu -std=c++11. Do đó, chọn -std=c++0xlàm mặc định cho chế độ tương thích C ++ 11 là một lựa chọn hợp lý. Trên máy của tôi, ít nhất là theo trang người đàn ông , -std=c++0x-std=c++11giống hệt nhau.
Ali

1
@Troyseph Bây giờ, đúng là sẽ tốt hơn -std=c++11nếu sử dụng trình biên dịch hỗ trợ nó và Qt có thể đủ thông minh để làm như vậy. Chà, nếu vấn đề này làm bạn tổn thương đến mức đó, bạn có thể nộp báo cáo lỗi ...
Ali

32

Thêm phần này vào tệp .pro của bạn

QMAKE_CXXFLAGS += -std=c++11

hoặc là

CONFIG += c++11

18

Thay thế cho việc xử lý cả hai trường hợp được giải quyết trong câu trả lời xuất sắc của Ali, tôi thường thêm

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

vào tập tin dự án của tôi. Điều này có thể hữu ích khi bạn không thực sự quan tâm nhiều đến việc mọi người đang sử dụng phiên bản Qt nào trong nhóm của bạn, nhưng bạn muốn họ kích hoạt C ++ 11 trong mọi trường hợp.


Điều này nên là -std = c ++ 11
Predrag Manojlovic

8

thêm vào tập tin qmake của bạn

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

4

Nếu bạn đang sử dụng phiên bản cũ hơn của QT (<5), hãy thử điều này

QMAKE_CXXFLAGS += -std=c++0x

1

Nơi duy nhất tôi đã làm cho nó hoạt động thành công là bằng cách tìm kiếm trong:

... \ Qt \ {5,9; hoặc phiên bản của bạn} \ mingw {53_32; hoặc phiên bản của bạn} \ mkspecs \ win32-g ++ \ qmake.conf:

Sau đó, tại dòng:

QMAKE_CFLAGS           += -fno-keep-inline-dllexport

Biên tập :

QMAKE_CFLAGS           += -fno-keep-inline-dllexport -std=c++11
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.