Tôi đang cố thêm cờ biên dịch /std:c++17
vào VS2017 với CMake. Tôi đang sử dụng nền tảng "hiện đại" cách cho đến nay:Cách bật/std: C++ 17 trong VS2017 với CMake
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF) # -std=c++11 instead of -std=gnu++11
set(MY_CXX_COMPILE_FEATURES cxx_generic_lambdas cxx_range_for cxx_strong_enums)
add_library(mylib INTERFACE)
target_compile_features(mylib INTERFACE ${MY_CXX_COMPILE_FEATURES})
này cho biết thêm /std:c++14
trong VS2017 (mà có thể là mặc định không?). Tuy nhiên, tôi gặp sự cố khi chuyển đổi sang C++ 17 (tức là có thêm /std:c++17
). Nếu tôi chỉ cần thêm nó bằng tay, tôi nhận được cảnh báo không quá thoải mái vì cả hai lá cờ có mặt:
1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'
Tôi đã thử set(CMAKE_CXX_STANDARD 17)
nhưng nó không có hiệu lực, trên thực tế các CMake tài liệu đề cập rằng CMAKE_CXX_STANDARD
không có hiệu lực trên VS.
Để thêm tính năng C++ 17 vào target_compile_features
, có vẻ như chưa có bất kỳ điều gì (ngay cả trong CMake-3.9.0-rc5), và ngay cả khi có, tôi đặc biệt chỉ sử dụng std::optional
từ C++ 17 và không có các cờ target_compile_features
cho các tính năng thư viện như std::optional
.
Vì vậy, câu hỏi của tôi là, cách tốt nhất (hoặc ít xấu xí nhất) để làm điều này với CMake là gì? Và theo một cách nào đó nó cũng sẽ hoạt động với gcc và clang? Tôi rất vui khi sử dụng phiên bản CMake gần đây (3.8 hoặc 3.9). Tôi thích nó được "đẹp" và không tự lặp qua CXX_COMPILE_FLAGS và loại bỏ chuỗi "/ std: C++ 14" hoặc một số hack như thế.
(Sửa: Nó cũng có thể là VS /std:c++latest
switch - nào là tốt Cả hai làm việc cho mục đích này..)
Xem https://gitlab.kitware.com/cmake/cmake/issues/16482, đây là công việc được tiến hành. – Florian
Cập nhật: 'CMAKE_CXX_STANDARD 17' hiện có thể có trong CMake mới nhất hàng đêm và sẽ chuyển sang CMake-3.10. – Ela782