386

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

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

に追加しようとし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 機能を有効にする方法がわかりません。

4

15 に答える 15

444

CMake 3.1 では、使用できる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 issue #15943

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

  • cmake_minimum_requiredを使用して CMake 3.0 以降を要求するか、または

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

      # Fix behavior of CMAKE_CXX_STANDARD when targeting macOS.
      if (POLICY CMP0025)
        cmake_policy(SET CMP0025 NEW)
      endif ()
    
于 2015-06-23T18:05:27.910 に答える
191

The CMake command target_compile_features() is used to specify the required C++ feature cxx_range_for. CMake will then induce the C++ standard to be used.

cmake_minimum_required(VERSION 3.1.0 FATAL_ERROR)
project(foobar CXX)
add_executable(foobar main.cc)
target_compile_features(foobar PRIVATE cxx_range_for)

There is no need to use add_definitions(-std=c++11) or to modify the CMake variable CMAKE_CXX_FLAGS, because CMake will make sure the C++ compiler is invoked with the appropriate command line flags.

Maybe your C++ program uses other C++ features than cxx_range_for. The CMake global property CMAKE_CXX_KNOWN_FEATURES lists the C++ features you can choose from.

Instead of using target_compile_features() you can also specify the C++ standard explicitly by setting the CMake properties CXX_STANDARD and CXX_STANDARD_REQUIRED for your CMake target.

See also my more detailed answer.

于 2013-11-23T17:27:43.677 に答える
93

私は使っている

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
CHECK_CXX_COMPILER_FLAG("-std=c++0x" COMPILER_SUPPORTS_CXX0X)
if(COMPILER_SUPPORTS_CXX11)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
elseif(COMPILER_SUPPORTS_CXX0X)
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++0x")
else()
        message(STATUS "The compiler ${CMAKE_CXX_COMPILER} has no C++11 support. Please use a different C++ compiler.")
endif()

しかし、で遊ぶならC++11g++ 4.6.1かなり古いです。新しいg++バージョンを入手してみてください。

于 2014-09-14T19:04:46.900 に答える
60

Cxx 標準を設定する最も簡単な方法は次のとおりです。

 set_property(TARGET tgt PROPERTY CXX_STANDARD 11)

詳細については、CMake のドキュメントを参照してください。

于 2015-05-15T03:50:23.230 に答える
42

SET(CMAKE_CXX_FLAGS "-std=c++0x")結局のところ、多くの C++11 機能がアクティブになります。機能しなかった理由は、ステートメントが次のようになっているためです。

set(CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")

このアプローチに従って、どういうわけか-std=c++0xフラグが上書きされ、機能しませんでした。フラグを 1 つずつ設定するか、リスト メソッドを使用して動作しています。

list( APPEND CMAKE_CXX_FLAGS "-std=c++0x ${CMAKE_CXX_FLAGS} -g -ftest-coverage -fprofile-arcs")
于 2012-06-01T14:59:31.140 に答える
32

CMake 3.8以降では、使用できます

target_compile_features(target PUBLIC cxx_std_11)

ツールチェーンがこの標準に準拠できない場合に生成ステップを失敗させたい場合は、これを必須にすることができます。

set_target_properties(target PROPERTIES CXX_STANDARD_REQUIRED ON)

標準 C++ に厳密に準拠したい場合、つまり、コンパイラ (GCC など-std=gnu++17) によって提供される C++ 拡張機能を避けたい場合は、追加で設定します。

set_target_properties(target PROPERTIES CXX_EXTENSIONS OFF)

これは、最新の CMake の紹介-> 機能の追加 -> C++11 以降で詳細に文書化されています。また、古いバージョンの CMake に制限されている場合に、これらのバージョンでこれを実現する方法についてのアドバイスも提供します。

于 2018-04-01T11:37:27.343 に答える
4

私にとってうまくいくのは、CMakeLists.txt に次の行を設定することです。

set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")

このコマンドを設定すると、コンパイラの C++11 機能がアクティブになり、コマンドを実行した後、コードで使用してエラーなしでコンパイルcmake ..できるはずです。range based for loops

于 2016-08-01T08:27:28.463 に答える
3

この2行だけで十分だと思います。

set(CMAKE_CXX_STANDARD 11)

set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
于 2018-06-13T09:36:10.637 に答える
0

以下を使用できます。これにより、環境に基づいて機能が自動的に変更されます。

target_compile_features(your_target INTERFACE cxx_std_20)

例えば、

  • Gnu/Linux では、以下が追加されます-std=gnu++20
  • Clang/Ninja を使用する Windows では、次のようになります。-std=c++20
  • MSVC を使用する Windows では、次のようになります。/std=c++20

したがって、可能な限り多くの環境をサポートします。

于 2021-11-02T01:48:28.770 に答える