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_required
CMake 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 ()