2017-08-15 3 views
9

私は統合CMake 3.8をサポートするVS 15.3を使用しています。特定のコンパイラごとにフラグを書くことなくC++ 17をどのようにターゲットできますか?私はCMakeのは「/ STD:C++最新の」追加すると予想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") 

:私の現在のグローバル設定が動作しない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

要するに

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

あなたはクランやGCCのような他のコンパイラのためのそのset(CMAKE_CXX_STANDARD 17)を維持することができます。しかし、Visual Studioでは無用です。

cmakeのはまだこれをサポートしていない場合は、次の操作を行うことができます:CMake 3.9 documentationから

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ああ!私は訂正した! –

1

最近のCMakeでは、グローバル変数レベルではなくターゲットレベルでCXX標準を割り当て、ビルドインプロパティ(ここではhttps://cmake.org/cmake/help/latest/manual/cmake-properties.7.html)を使用してコンパイラーにとらわれないようにしておくのが最適です。例については

:一般的に

set_target_properties(FooTarget PROPERTIES 
      CXX_STANDARD_REQUIRED 17 
      CXX_EXTENSIONS OFF 
      etc.. 
      ) 
関連する問題