2017-03-16 9 views
15

GCC 4.xは--std=c++14スイッチをC++ 14コードに使用できません。代わりに--std=c++1yが必要です。それ以降のバージョンは--std=c++1zですが、まだ設定されていない--std=c++17(おそらく)ではありません(2016年にこれを書きます)。おそらくC++ 11にも同様の問題があります。CMakeがGCCのバージョンに基づいてstd = C++ 14/C++ 1yまたはC++ 17/C++ 1zを渡す方法を教えてください。

CMakeには、GCCのバージョンに応じて適切なスイッチを渡すための機能(おそらくモジュール)がありますか?

+0

* "おそらくC++ 11と同様の問題があります。" *これはC++ 11 vs C++ 0xで、前者はgcc4.7/8程度で導入されています。 –

+0

Btw、古いスイッチ(0x、1y、1z)は現代のものをサポートするコンパイラでもうまく動作するので、この "正しい"ものを得るための*本当の*必要はありません。 –

+1

**生のコンパイラフラグを渡すのがCMakeの反パターンで、メタ構築システム/ビルドシステムジェネレータの全体のコンセプトに反して、この "正しい" –

答えて

30

、CMakeの3.1以降でこれを行うために推奨される方法は、対象のデフォルト値を指定するCXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONSターゲットのプロパティ、またはその変数同等物を使用することです。完全な詳細はhereを見つけることができますが、ショートバージョンは、このような何かを行く:

cmake_minimum_required(VERSION 3.1) 
project(Example) 

set(CMAKE_CXX_STANDARD 14) 
set(CMAKE_CXX_STANDARD_REQUIRED ON) 
set(CMAKE_CXX_EXTENSIONS OFF) 
# ... Define targets, etc. as usual 

CMakeのは、コンパイラがサポートしているものに基づいて要求されたC++標準のための適切なコンパイラフラグを選択するか、それはdoesnの場合はエラー出力すべきです要求された標準をサポートする。

CMakeは、ターゲットプロパティを、CXX_STANDARDターゲットプロパティで指定されているものよりも新しい言語標準を使用するようにアップグレードすることがあります。 compile feature requirements(@FlorianWoltersの答えにあるように)を使用すると、言語標準の要件を上げることができます。実際には、CMakeは常に、ターゲットプロパティまたはコンパイル機能要件のいずれかによって指定されたより強い言語要件を選択します。また、CXX_EXTENSIONSがコンパイル機能とやり取りする方法を正確に反映していないことに注意してください。は、ほとんどの一般的なコンパイラでもCXX_STANDARDも指定されている場合にのみ有効です。

7

コンパイラがフラグをサポートしているかどうかを確認しますか?特にC++のバージョンを指定したい場合は、おそらく

include(CheckCXXCompilerFlag) 

# Check for standard to use 
check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17) 
if(HAVE_FLAG_STD_CXX17) 
    # Have -std=c++17, use it 
else() 
    check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z) 
    if(HAVE_FLAG_STD_CXX1Z) 
     # Have -std=c++1z, use it 
    else() 
     # And so on and on... 
    endif() 
endif() 
のようなもの
+2

@einpoklum私は問題なしでこの正確なコードを2、3年間使っています。 GCCとClang(私が最後に試みたのは、 '-std = C++ 17'オプションをサポートしていませんでした)。 –

7

最新のCMakeコードでは、target_compile_featuresコマンドを使用して特定のC++標準を要求する必要があります。これは、ビルド要件のみ(PRIVATE)、使用要件のみ(INTERFACE)またはビルドおよび使用要件(PUBLIC)として指定できます。

例:

cmake_minimum_required(VERSION 3.9.4) 

project(cpp-snippets) 
add_executable(cpp-snippets "main.cpp") 
target_compile_features(cpp-snippets PRIVATE cxx_std_17) 

は多くを学ぶためにcmake-compile-features公式CMakeのドキュメントに言語規格が必要な部分を参照してください。

+0

「使用要件」とは対照的に「ビルド要件」とは何ですか? – einpoklum

+2

また、 'cxx_std_YY'メタ機能のサポートもCMake 3でのみ追加されていることを強調しておかなければなりません。8、 'CXX_STANDARD'ファミリのターゲットプロパティはずっと長くなっていますが、' cxx_std_YY'メタ機能だけではコンパイラの拡張機能を使用できるかどうかは制御されません。 –

+1

@einpoklum答えで使用されているように、_build requirements_はターゲット自体を構築するために必要なものを参照し、_usage requirements_はターゲットとリンクするものが要件として継承するものです。 –

関連する問題