CMake で C++ 11 をアクティブ化するにはどうすればよいですか? 質問する

CMake で C++ 11 をアクティブ化するにはどうすればよいですか? 質問する

CMakeで生成されたmakefileを実行してプログラムをコンパイルしようとすると、次のようなエラーが発生します。

範囲ベースの for ループは C++ 98 モードではサポートされていません。

add_definitions(-std=c++0x)を追加してみましたCMakeLists.txtが、効果はありませんでした。

私もこれを試してみました:

if(CMAKE_COMPILER_IS_GNUCXX)
    add_definitions(-std=gnu++0x)
endif()

するとg++ --version、次のようになります:

g++ (Ubuntu/Linaro 4.6.1-9ubuntu3) 4.6.1

も試しましたがSET(CMAKE_CXX_FLAGS "-std=c++0x")、これも機能しません。

CMake を使用して C++ 11 の機能を有効にする方法がわかりません。

ベストアンサー1

CMake 3.1は2014年にリリースされ、CMAKE_CXX_STANDARD使用できる変数です。常に CMake 3.1 以降が使用可能であることがわかっている場合は、トップレベルの CMakeLists.txt ファイルにこれを記述するか、新しいターゲットが定義される直前に記述します。

set (CMAKE_CXX_STANDARD 11)

古いバージョンの CMake をサポートする必要がある場合 (最近ではほとんどありません)、使用できるマクロを以下に示します。

macro(use_cxx11)
  if (CMAKE_VERSION VERSION_LESS "3.1")
    if (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
      set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=gnu++11")
    endif ()
  else ()
    set (CMAKE_CXX_STANDARD 11)
  endif ()
endmacro(use_cxx11)

このマクロは現時点では GCC のみをサポートしていますが、他のコンパイラに拡張するのは簡単なはずです。

use_cxx11()次に、 C++11 を使用するターゲットを定義する CMakeLists.txt ファイルの先頭に記述します。

macOS をターゲットとする clang ユーザー向けの CMake の問題 #15943

CMakeとclangを使ってmacOSをターゲットにしている場合は、バグこれにより、機能が動作しなくなる可能性がありますCMAKE_CXX_STANDARD(コンパイラ フラグを追加しない)。次のいずれかのことを必ず実行してください。

  • 使用cmake_minimum_requiredCMake 3.0以降を必要とする、または

  • コマンドの前に CMakeLists.txt ファイルの先頭に次のコードを記述して、ポリシー CMP0025 を NEW に設定しますproject

      # Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
      if (POLICY CMP0025)
        cmake_policy(SET CMP0025 NEW)
      endif ()
    

おすすめ記事