C++11/14/17/20/23をCMakeで使う!各標準のサンプルコード付き

2024-04-02

CMakeにおけるCMAKE_CXX_STANDARD変数の詳細解説

CMakeのCMAKE_CXX_STANDARD変数は、プロジェクトで使用されるC++言語の標準規格を指定するために使用されます。これは、コンパイラにどの言語機能が利用可能であるかを伝える重要な役割を果たします。

設定方法

CMAKE_CXX_STANDARD変数は、以下の方法で設定できます。

  • CMakeLists.txtファイル内で直接設定する。
  • cmakeコマンドラインオプションで設定する。
  • GUIベースのCMakeツールで設定する。

# CMakeLists.txtファイル内で設定する
set(CMAKE_CXX_STANDARD 14)

# cmakeコマンドラインオプションで設定する
cmake -DCMAKE_CXX_STANDARD=17 ..

# GUIベースのCMakeツールで設定する
# ツールによって設定方法は異なるため、ドキュメントを参照してください。

利用可能な値

CMAKE_CXX_STANDARD変数には、以下の値を設定できます。

  • 98: C++98
  • 11: C++11
  • 14: C++14
  • 17: C++17
  • 20: C++20
  • 23: C++23

注意事項

  • 設定する値は、コンパイラがサポートしている必要があります。
  • 設定した値がコンパイラでサポートされていない場合、ビルドエラーが発生する可能性があります。
  • プロジェクト全体で統一されたC++言語標準を使用することを推奨します。

補足

  • CMAKE_CXX_STANDARD変数以外にも、C++言語の機能を制御するための変数がいくつか用意されています。詳細は、CMakeドキュメントを参照してください。
  • C++言語標準は定期的に更新されています。最新の情報を確認するようにしてください。

この解説が、CMakeにおけるCMAKE_CXX_STANDARD変数の理解に役立てば幸いです。



CMAKE_CXX_STANDARD を使ったサンプルコード

# CMakeLists.txtファイル

set(CMAKE_CXX_STANDARD 11)

add_executable(hello_world main.cpp)

target_link_libraries(hello_worldstdc++fs)

# main.cppファイル

#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path = "/tmp/hello_world";

  if (std::filesystem::exists(path)) {
    std::cout << "The path " << path << " exists." << std::endl;
  } else {
    std::cout << "The path " << path << " does not exist." << std::endl;
  }

  return 0;
}

C++14の機能を使用するサンプルコード

# CMakeLists.txtファイル

set(CMAKE_CXX_STANDARD 14)

add_executable(hello_world main.cpp)

target_link_libraries(hello_worldstdc++fs)

# main.cppファイル

#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path = "/tmp/hello_world";

  if (std::filesystem::exists(path)) {
    std::cout << "The path " << path << " exists." << std::endl;
  } else {
    std::cout << "The path " << path << " does not exist." << std::endl;
  }

  // C++14のラムダ式を使用
  std::for_each(std::filesystem::directory_iterator(path),
                [](const std::filesystem::directory_entry& entry) {
                  std::cout << entry.path() << std::endl;
                });

  return 0;
}

C++17の機能を使用するサンプルコード

# CMakeLists.txtファイル

set(CMAKE_CXX_STANDARD 17)

add_executable(hello_world main.cpp)

target_link_libraries(hello_worldstdc++fs)

# main.cppファイル

#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path = "/tmp/hello_world";

  if (std::filesystem::exists(path)) {
    std::cout << "The path " << path << " exists." << std::endl;
  } else {
    std::cout << "The path " << path << " does not exist." << std::endl;
  }

  // C++17のstd::filesystem::copy_ifを使用
  std::filesystem::copy_if(std::filesystem::directory_iterator(path),
                          std::filesystem::directory_iterator(),
                          [](const std::filesystem::directory_entry& entry) {
                            return entry.is_regular_file();
                          },
                          "/tmp/destination");

  return 0;
}

C++20の機能を使用するサンプルコード

# CMakeLists.txtファイル

set(CMAKE_CXX_STANDARD 20)

add_executable(hello_world main.cpp)

target_link_libraries(hello_worldstdc++fs)

# main.cppファイル

#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path = "/tmp/hello_world";

  if (std::filesystem::exists(path)) {
    std::cout << "The path " << path << " exists." << std::endl;
  } else {
    std::cout << "The path " << path << " does not exist." << std::endl;
  }

  // C++20のranges::for_eachを使用
  ranges::for_each(std::filesystem::directory_iterator(path),
                  [](const std::filesystem::directory_entry& entry) {
                    std::cout << entry.path() << std::endl;
                  });

  return 0;
}

C++23の機能を使用するサンプルコード

# CMakeLists.txtファイル

set(CMAKE_CXX_STANDARD 23)

add_executable(hello_world main.cpp)

target_link_libraries(hello_worldstdc++fs)

# main.cppファイル

#include <iostream>
#include <filesystem>

int main() {
  std::filesystem::path path = "/tmp/hello_world";

  if


CMAKE_CXX_STANDARD を設定するその他の方法

  • cmake コマンドラインオプション
cmake -DCMAKE_CXX_STANDARD=17 ..
  • GUI ベースの CMake ツール

    • CMake GUI
    • CLion
    • Qt Creator

各方法の詳細

  • cmake コマンドラインオプション

    cmake コマンドを実行する際に、-DCMAKE_CXX_STANDARD オプションを指定することで、CMAKE_CXX_STANDARD 変数を設定できます。

    cmake -DCMAKE_CXX_STANDARD=17 ..
    

    このオプションは、CMakeLists.txtファイルよりも優先されます。

  • GUI ベースの CMake ツールを使用する場合は、ツールによって設定方法は異なります。詳細は、ツールのドキュメントを参照してください。

注意事項

  • 設定方法は、使用している CMake のバージョンや環境によって異なる場合があります。



CMakeにおける"get_target_property()"コマンド: ターゲットの情報を自在に操る

get_target_property()コマンドは、CMakeプロジェクトで定義されたターゲットからプロパティを取得するために使用されます。ターゲットプロパティは、ターゲットのビルド方法や動作を制御するために使用される情報です。構文引数VAR: ターゲットプロパティの値を格納する変数名



CMakeの"Commands"における"fltk_wrap_ui()"プログラミングを徹底解説!

この解説では、CMakeの"Commands"における"fltk_wrap_ui()"プログラミングについて、分かりやすく説明します。"fltk_wrap_ui()"は、CMakeでFLTK GUIアプリケーションをビルドするために使用されるマクロです。このマクロは、FLTK GUI定義ファイルをC++コードに変換し、プロジェクトに組み込みます。


cmake_policy()コマンドを使いこなしてCMakeプロジェクトをマスター

cmake_policy()コマンドの基本的な構文は以下の通りです。<policy-id>: ポリシーの識別子。CMP<NNNN>形式で指定されます。<behavior>: ポリシーの動作。OLDまたはNEWを指定します。OLDとNEWの動作の違い


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。


CMake: find_library()とtarget_link_directories()の連携

target_link_directories()コマンドは、CMakeプロジェクト内のターゲットに対して、リンカがライブラリを検索するディレクトリを指定するために使用されます。これは、ターゲットがリンクするライブラリが標準の検索パスに存在しない場合に特に重要です。



CMakeの「CMAKE_EXPORT_NO_PACKAGE_REGISTRY」を使いこなして、開発をもっと効率化しよう!

CMAKE_EXPORT_NO_PACKAGE_REGISTRY は、CMake の "Variables" における重要な変数の 1 つです。これは、export(PACKAGE) コマンドの動作を制御し、特定の状況下でパッケージレジストリへの書き込みを抑制するために使用されます。


CMakeにおけるCMAKE_CROSSCOMPILING変数の詳細解説

CMAKE_CROSSCOMPILING変数は、CMakeがクロスコンパイル環境で実行されているかどうかを判断するために使用されます。これは、ターゲットプラットフォームとビルドプラットフォームが異なる場合に設定されます。設定方法CMAKE_CROSSCOMPILING変数は、以下の方法で設定できます。


異なるアーキテクチャ向けにアセンブリソースファイルをコンパイル:ASM_DIALECTFLAGSの活用例

ASM_DIALECTFLAGSは、以下の方法で設定できます。CMakeLists. txtファイル内でset()コマンドを使用するコマンドラインで-Dオプションを使用する以下の例は、ASM_DIALECTFLAGSを使用して、異なるアーキテクチャ向けの異なるアセンブリソースファイルをコンパイルする方法を示しています。


【初心者向け】CMakeでテストを実行する3つのステップ: ctest_test() コマンドから始める

引数:<test_name>: 実行するテストの名前。ワイルドカードを使用して、名前パターンに一致する複数のテストを選択できます。[OPTIONAL arguments]: テストの実行方法を制御するオプション引数。ctest_test()コマンドには、テストの実行方法を細かく制御するための様々なオプション引数が用意されています。以下に、よく使用されるオプション引数をいくつか紹介します。


CMake の if() コマンド: デバッグとトラブルシューティング

構文条件式if() コマンドの引数には、条件式を指定します。条件式は、以下のいずれかの形式で記述できます。変数の比較: <variable> <operator> <value>コマンドの存在チェック: COMMAND <command-name>