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 を設定する必要はありません。