web-dev-qa-db-ja.com

CMakeでC ++ 17を有効にする方法

統合CMake 3.8をサポートするVS 15.3を使用しています。特定のコンパイラーごとにフラグを作成せずに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ソリューションファイルを生成するときにCMakeが「/ std:c ++ lastest」または同等のものを追加することを期待しましたが、c ++ 17フラグが見つからず、コンパイラエラーが発生しました。

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

CMake3.9ドキュメント

MSVCなどの標準レベルの概念を持たないコンパイラの場合、これは効果がありません。

要するに、CMakeはVC++ 2017に追加された標準フラグに対応するように更新されていません。

VC++ 2017(またはそれ以降)が使用されているかどうかを検出し、今のところ対応するフラグを自分で追加する必要があります。


CMake 3.10(およびそれ以降)では、VC++の新しいバージョンでこれが修正されました。 .10ドキュメント を参照してください。

28

現代のCMakeでは、グローバル変数レベルの代わりにターゲットレベルでCXX標準を割り当て、組み込みプロパティを使用するのが最善であることがわかりました(ここに見られます: https://cmake.org/cmake/help/latest /manual/cmake-properties.7.html )コンパイラに依存しないようにします。

例えば:

set_target_properties(FooTarget PROPERTIES
            CXX_STANDARD 17
            CXX_EXTENSIONS OFF
            etc..
            )
12
loneraver

ClangやGCCのような他のコンパイラーのために、set(CMAKE_CXX_STANDARD 17)を保持できます。しかし、Visual Studioの場合は役に立ちません。

それでもCMakeがこれをサポートしていない場合は、次のことができます。

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

現代のCMakeは、この目的のためのインターフェースtarget_compile_featuresを提案しています。ドキュメントはこちら: 言語標準が必要

次のように使用します。

target_compile_features(${TARGET_NAME} PRIVATE cxx_std_17)

5
nbout