CMakeでC++標準を設定する: CMAKE_CXX_STANDARDの詳細と代替方法
CMAKE_CXX_STANDARD
は CMake で使用される変数であり、プロジェクトで使用される C++ 標準を指定するために使用されます。これは、ターゲットのコンパイルに使用されるコンパイラフラグを決定します。
設定方法
CMAKE_CXX_STANDARD
は、CMake の CMakeLists.txt
ファイルで設定できます。以下の例をご覧ください。
set(CMAKE_CXX_STANDARD 17)
上記の例では、プロジェクトで使用される C++ 標準は C++17 に設定されます。
サポートされている標準
以下の C++ 標準が CMAKE_CXX_STANDARD
でサポートされています。
- C++26
- C++23
- C++20
- C++17
- C++14
- C++11
- C++98
コンパイラフラグ
CMAKE_CXX_STANDARD
の値に応じて、CMake はコンパイラフラグを生成します。以下の例をご覧ください。
標準 | フラグ |
---|---|
C++98 | -std=c++98 |
C++11 | -std=c++11 |
C++14 | -std=c++14 |
C++17 | -std=c++17 |
C++20 | -std=c++20 |
C++23 | -std=c++23 |
C++26 | -std=c++26 |
CMAKE_CXX_STANDARD
を設定しても、コンパイラ固有の拡張機能は無効になりません。無効にするには、CMAKE_CXX_EXTENSIONS
プロパティを使用する必要があります。CMAKE_CXX_STANDARD
を設定すると、CMake はtarget_compile_features
プロパティを自動的に設定します。- 使用しているコンパイラが指定された C++ 標準をサポートしていることを確認する必要があります。
- CMake は、複数の C++ 標準をサポートするコンパイラ (GCC など) を使用している場合、自動的に最も新しい標準を選択します。
CMAKE_CXX_STANDARD
は、プロジェクト全体の C++ 標準を設定するために使用されます。特定のターゲットに対して異なる C++ 標準を設定するには、set_property
コマンドを使用する必要があります。
C++11 でプロジェクトをコンパイルする
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 11)
add_executable(myprogram main.cpp)
上記のコードは、以下のことを行います。
main.cpp
ファイルを使用してmyprogram
という名前の実行可能ファイルをビルドします。- プロジェクトで使用される C++ 標準を C++11 に設定します。
- プロジェクトの名前を
myproject
に設定します。 - CMake の最低バージョンを 3.10 に設定します。
特定のターゲットに対して C++20 を設定する
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 11)
add_executable(myprogram main.cpp)
add_executable(mytarget target.cpp)
set_property(TARGET mytarget PROPERTY CXX_STANDARD 20)
解説
mytarget
ターゲットに対して C++ 標準を C++20 に設定します。target.cpp
ファイルを使用してmytarget
という名前の実行可能ファイルをビルドします。main.cpp
ファイルを使用してmyprogram
という名前の実行可能ファイルをビルドします。- プロジェクトで使用される C++ 標準を C++11 に設定します。
- プロジェクトの名前を
myproject
に設定します。 - CMake の最低バージョンを 3.10 に設定します。
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 17)
set(CMAKE_CXX_EXTENSIONS OFF)
add_executable(myprogram main.cpp)
main.cpp
ファイルを使用してmyprogram
という名前の実行可能ファイルをビルドします。- コンパイラ固有の拡張機能を無効にします。
- プロジェクトで使用される C++ 標準を C++17 に設定します。
- プロジェクトの名前を
myproject
に設定します。 - CMake の最低バージョンを 3.10 に設定します。
代替手段
以下に、CMAKE_CXX_STANDARD
の代替手段をいくつか紹介します。
set_property コマンドを使用する
set_property
コマンドを使用して、特定のターゲットに対して C++ 標準を設定できます。以下の例をご覧ください。
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 11)
add_executable(myprogram main.cpp)
set_property(TARGET myprogram PROPERTY CXX_STANDARD 17)
解説
上記の例では、myprogram
ターゲットに対して C++ 標準を C++17 に設定します。
target_compile_features プロパティを使用する
target_compile_features
プロパティを使用して、特定のターゲットに対して C++ 標準に対応するコンパイル機能を有効にすることができます。以下の例をご覧ください。
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_STANDARD 11)
add_executable(myprogram main.cpp)
target_compile_features(myprogram PUBLIC CXX_STANDARD_17)
解説
上記の例では、myprogram
ターゲットに対して C++ 標準 17 に対応するコンパイル機能を有効にします。
コンパイラフラグを直接設定する
CMAKE_CXX_FLAGS
プロパティを使用して、コンパイラフラグを直接設定できます。以下の例をご覧ください。
cmake_minimum_required(VERSION 3.10)
project(myproject)
set(CMAKE_CXX_FLAGS "-std=c++17")
add_executable(myprogram main.cpp)
解説
上記の例では、myprogram
ターゲットに対して -std=c++17
というコンパイラフラグを設定します。
- コンパイラフラグを直接設定する場合は、使用しているコンパイラが指定されたフラグをサポートしていることを確認する必要があります。
target_compile_features
プロパティを使用する場合は、CMAKE_CXX_STANDARD
を設定する必要はありません。set_property
コマンドを使用する場合は、CMAKE_CXX_STANDARD
を設定する必要はありません。