2017-08-15 90 views
9

我使用VS 15.3,它支持集成的CMake 3.8。如何在不爲每個特定編譯器編寫標誌的情況下定位C++ 17?我目前的全局設置不起作用:如何在CMake中啓用C++ 17

# https://cmake.org/cmake/help/latest/prop_tgt/CXX_STANDARD.html 
set(CMAKE_CXX_STANDARD 17) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 

# expected behaviour 
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++lastest") 

我預想的CMake添加「/ STD:C++最新的」生成VS解決方案文件時或等價物,但沒有C++ 17層的標誌被發現,導致編譯器錯誤:

C1189 #error: class template optional is only available with C++17. 
+1

CMake的一般不會消除需要寫標誌爲每個特定的編譯器。 – VTT

+1

「VS 15.3」是否指Visual Studio 2017預覽版3?或者你的意思是Visual Studio 2015更新3(如果有的話,它不支持C++ 17)? –

+0

@Someprogrammerdude我正在使用'std :: optional'特性,如果我手動向CMakeLists添加'「/ std:C++ lastest」''標誌,可以使用這些特性。 – MiP

回答

6

CMake 3.9 documentation

For compilers that have no notion of a standard level, such as MSVC, this has no effect.

總之,CMake的尚未更新,以適應標準標誌添加到VC++ 2017.

您必須檢測是否使用了VC++ 2017(或更高版本),並且現在自己添加相應的標誌。


在CMake 3.10(及更高版本)中,對於較新版本的VC++已經修復了這個問題。請參閱the 3.10 documentation

+2

較新的CMake 3.10(及更高版本)文檔說它適用於Visual Studio 2015更新3或更新版本。僅2015版Update 3之前的Visual Studio版本不受支持。上面的鏈接實際上是最新的文檔,這反映了這一點。 – Marcus10110

+1

@ Marcus10110正確,將鏈接更改爲指向3.9文檔。並補充說明它正在爲新版本修復。謝謝。 –

2

您可以爲其他編譯器保留set(CMAKE_CXX_STANDARD 17),如Clang和GCC。但對於Visual Studio而言,這是無用的。

如果CMake的仍然不支持這一點,你可以做到以下幾點:

if(MSVC) 
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /std:c++17") 
endif(MSVC) 
+1

[最近的VS更改](https://docs.microsoft.com/en-us/cpp/what-s-new-for-visual-cpp -in-visual-studio)允許使用'/ std:C++ 14','/ std:C++ 17'和'/ std:C++ latest'標誌來設置標準。 – VTT

+0

@VTT哦!我站好了! –