CMakeでVS2017に_/std:c++17
_コンパイラフラグを追加しようとしています。これまでのところ、「最新の」クロスプラットフォームの方法を使用しています。
_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})
_
これにより、VS2017に_/std:c++14
_が追加されます(いずれにせよ、これがデフォルトでしょうか?)。ただし、これをC++ 17に切り替えるのに問題があります(つまり、_/std:c++17
_を追加します)。手動で追加するだけの場合、両方のフラグが存在するため、それほど良くない警告が表示されます。
_
1>cl : Command line warning D9025: overriding '/std:c++14' with '/std:c++17'
_
私はset(CMAKE_CXX_STANDARD 17)
を試しましたが、効果はありません。実際、CMakeのドキュメントでは_CMAKE_CXX_STANDARD
_はVSに影響を与えないと述べています。
_target_compile_features
_にC++ 17の機能を追加することに関しては、まだ(CMake-3.9.0-rc5でも)あるようには見えず、たとえあったとしても、私は特にC++ 17の_std::optional
_、および_target_compile_features
_などのライブラリ機能用の_std::optional
_フラグはありません。
だから私の質問は、CMakeでこれを行うための最良の(または最もい)方法は何ですか?そして、ある意味では、gccとclangでも動作しますか?最新のCMakeバージョン(3.8または3.9)を使用できてうれしいです。 CXX_COMPILE_FLAGSを手動でループして文字列「/ std:c ++ 14」またはそのようなハックを削除しないでください。
(編集:VS _/std:c++latest
_スイッチでも可能です-どちらでも可能です。両方とも目的のために機能します。)
コメントを回答に変える
CMakeチームは、VS2017(2017年7月現在、CMakeバージョン3.10向け)に取り組んでいます:
これらのフラグはかなり新しいスイッチのようです(この質問の日付に関連して):
VS 2017 15.3プレビューは/ std:c ++ 17をサポートするようになりました
したがって、Visual Studioの場合、CMakeが公式にサポートするまで、コンパイラスイッチを「手動で」交換または追加する必要があります。
これは、std:c++latest
(たとえば、CMake 3.8.0バージョンで既にサポートされています)についてテストしたコードスニペットです。
if (MSVC_VERSION GREATER_EQUAL "1900")
include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("/std:c++latest" _cpp_latest_flag_supported)
if (_cpp_latest_flag_supported)
add_compile_options("/std:c++latest")
endif()
endif()
CLangおよびGNUの場合、サポートは2017年のメインソースコードブランチに統合され、CMakeバージョン3.8以降の一部です。
3.10以降のCMakeバージョン MSVC C++標準スイッチをサポート 19.0.24215より新しいMSVCバージョンの場合。いずれかのバージョン要件が満たされていない場合、効果はありません。
Visual Studioでプログラムを正しいC++標準モードでコンパイルするための唯一の移植可能なアプローチは、少なくともCMake 3.10を要求し、ターゲットプロパティを設定することです CXX_STANDARD
希望する値と CXX_STANDARD_REQUIRED
to ON
。
使用例:
set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
set_property(TARGET my_target PROPERTY CXX_STANDARD_REQUIRED ON)