2014-10-11 29 views
9

Tôi đang cố gắng chạy mã C++ 11 trong CLion nhưng nó không hoạt động. Nó nói:Làm thế nào để kích hoạt C++ 11 trong CLion?

... 
    /projects/CLion/untitled/main.cpp:7:1: note: C++11 ‘constexpr’ only available with -std=c++11 or -std=gnu++11 
... 

Tôi cố gắng để thiết lập CMAKE_C_FLAGS--std=c++11 hoặc -std=gnu++11 nhưng tôi vẫn có cùng một vấn đề. Mã C++ thông thường biên dịch tốt.

Tôi phải đặt cờ nào trong cửa sổ CMake của CLion để biên dịch mã C++ 11?

Trả lời

17

Tôi cố gắng để thiết lập CMAKE_C_FLAGS

Theo documentation các CMAKE_C_FLAGS bộ cờ ngôn ngữ C cho tất cả build types. Đối với C++ bạn cần sử dụng CMAKE_CXX_FLAGS thay vì:

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11") 
+0

Các biến 'CMAKE_CXX_FLAGS' ở đâu? Tôi không quá quen thuộc với CMake. – hlin117

+0

@ hlin117, 'CMAKE_CXX_FLAGS' nằm trong tệp 'CMakeLists'. – Gluttton

+0

Tôi nhận thấy làm thế nào không rõ ràng câu hỏi của tôi là sau khi tôi đăng nó, xin lỗi. Tôi muốn hỏi, trong dòng 'set (CMAKE_CXX_FLAGS" $ {CMAKE_CXX_FLAGS} -std = C++ 11 ")', 'CMAKE_CXX_FLAGS' thứ hai phải được khởi tạo trước khi nó được tham chiếu (sử dụng' $ '), nhưng ở đâu nó được khởi tạo?(Tôi không thể tưởng tượng rằng biến được khởi tạo và tham chiếu trên cùng một dòng.) – hlin117

9

Đối với CMake 3.1 hoặc mới hơn, bạn có thể set the CMAKE_CXX_STANDARD variable-11:

Giá trị mặc định cho CXX_STANDARD tài sản của các mục tiêu.

Biến này được sử dụng để khởi tạo thuộc tính CXX_STANDARD trên tất cả các mục tiêu.

CXX_STANDARD documentation:

C++ chuẩn có các tính năng được yêu cầu để xây dựng mục tiêu này.

Thuộc tính này chỉ định tiêu chuẩn C++ có các tính năng được yêu cầu để tạo mục tiêu này. Đối với một số trình biên dịch, điều này dẫn đến việc thêm một cờ như -std=gnu++11 vào dòng biên dịch.

giá trị hỗ trợ là 98, 11 và 14.

Nếu giá trị đề nghị không dẫn đến một lá cờ biên dịch được bổ sung cho trình biên dịch sử dụng, một lá cờ tiêu chuẩn trước đó sẽ được thêm vào để thay thế. Điều này có nghĩa rằng việc sử dụng:

set_property(TARGET tgt PROPERTY CXX_STANDARD 11) 

với một trình biên dịch mà không hỗ trợ -std=gnu++11 hoặc một lá cờ tương đương sẽ không dẫn đến một lỗi hoặc cảnh báo, nhưng thay vào đó sẽ thêm -std=gnu++98 cờ nếu được hỗ trợ. Hành vi "phân rã" này có thể được kiểm soát với thuộc tính mục tiêu CXX_STANDARD_REQUIRED.

Xem hướng dẫn sử dụng cmake-compile-features(7) để biết thông tin về các tính năng biên dịch.

Thuộc tính này được khởi tạo bằng giá trị của biến số CMAKE_CXX_STANDARD nếu được đặt khi mục tiêu được tạo.

+4

Điều gì sẽ xảy ra nếu tôi muốn '-std = C++ 11' và không phải' -std = gnu ++ 11', làm thế nào để phân biệt 'CXX_STANDARD 11' giữa hai? – Ela782

Các vấn đề liên quan