web-dev-qa-db-ja.com

CMakeを使用してVS2017で/ std:c ++ 17を有効にする方法

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_スイッチでも可能です-どちらでも可能です。両方とも目的のために機能します。)

28
Ela782

コメントを回答に変える

  1. CMakeチームは、VS2017(2017年7月現在、CMakeバージョン3.10向け)に取り組んでいます:

    CMake:MSVC標準バージョンスイッチ

    これらのフラグはかなり新しいスイッチのようです(この質問の日付に関連して):

    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()
    
  2. CLangおよびGNUの場合、サポートは2017年のメインソースコードブランチに統合され、CMakeバージョン3.8以降の一部です。

    CMake:機能:C++ 17言語標準のサポートを追加

20
Florian

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)
15
tambre