、CMakeの3.1以降でこれを行うために推奨される方法は、対象のデフォルト値を指定するCXX_STANDARD
、CXX_STANDARD_REQUIRED
とCXX_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
も指定されている場合にのみ有効です。
* "おそらくC++ 11と同様の問題があります。" *これはC++ 11 vs C++ 0xで、前者はgcc4.7/8程度で導入されています。 –
Btw、古いスイッチ(0x、1y、1z)は現代のものをサポートするコンパイラでもうまく動作するので、この "正しい"ものを得るための*本当の*必要はありません。 –
**生のコンパイラフラグを渡すのがCMakeの反パターンで、メタ構築システム/ビルドシステムジェネレータの全体のコンセプトに反して、この "正しい" –