cmake不会编译为C++;11标准 我是C++新手,一直在编译/制作/链接/构建/任何东西,让我们看看有没有人能帮我。我做了一些搜索,找到了其他有类似问题的人,但我尝试了他们的解决方案,但运气不好,所以下面是: 一个简单的C++程序,使用C++ 11的功能,如统一初始化、线程、 toSype 等。生成未在作用域中声明“xxx”的错误。特别是现在我想使用 toSype ,并使用它在代码> STD< /COD>命名空间中,或者具体地说,代码> STD::toSype 创建错误“toSype”不是STD的成员,所以显然它不是用C++ 11编译的。

cmake不会编译为C++;11标准 我是C++新手,一直在编译/制作/链接/构建/任何东西,让我们看看有没有人能帮我。我做了一些搜索,找到了其他有类似问题的人,但我尝试了他们的解决方案,但运气不好,所以下面是: 一个简单的C++程序,使用C++ 11的功能,如统一初始化、线程、 toSype 等。生成未在作用域中声明“xxx”的错误。特别是现在我想使用 toSype ,并使用它在代码> STD< /COD>命名空间中,或者具体地说,代码> STD::toSype 创建错误“toSype”不是STD的成员,所以显然它不是用C++ 11编译的。,c++,c++11,cmake,C++,C++11,Cmake,这是我的制作文件: ##################################### cmake_minimum_required (VERSION 2.8) project (raspicam_test) find_package(raspicam REQUIRED) find_package(OpenCV) IF ( OpenCV_FOUND AND raspicam_CV_FOUND) MESSAGE(STATUS "COMPILING OPENCV TEST

这是我的制作文件:

#####################################
cmake_minimum_required (VERSION 2.8)
project (raspicam_test)
find_package(raspicam REQUIRED)
find_package(OpenCV)

IF  ( OpenCV_FOUND AND raspicam_CV_FOUND)
        MESSAGE(STATUS "COMPILING OPENCV TESTS")
        add_executable (main main.cpp)
        #target_compile_features(main PRIVATE cxx_range_for)
        set_property(TARGET main PROPERTY CXX_STANDARD 11)
        target_link_libraries (main ${raspicam_CV_LIBS})
ELSE()
        MESSAGE(FATAL_ERROR "OPENCV NOT FOUND IN YOUR SYSTEM")
ENDIF()
#####################################
正如你所看到的,我正在树莓圆周率上玩OpenCV。但是如果没有C++11函数,程序编译和运行不会出现问题。但是我想从C++11添加线程和其他好东西。根据CMAKE文档,我添加了行
set\u属性(需要目标主属性CXX\u标准11)

这对产生的错误没有影响。我先是在没有使用
\u所需的
的情况下完成的,然后才使用它。我还尝试了
target\u compile\u features()

其他详情: -在运行debian jessie的raspberry pi 3上编译 -CXX编译器是GNU4.9.2
-CMAKE 3.0.2

我总是使用CMAKE在代码中启用c++11,方法如下:

set(CMAKE_CXX_FLAGS "-std=c++11")
我的编译器是gcc(Debian 4.9.2-10)4.9.2,但在我的工作场所,我也使用其他版本,这种方法总是有效的

编辑(以避免变量覆盖):


CMake在3.1版本中添加对
CXX\U标准
CXX\U标准
属性的支持。
CXX\u标准
:取一个
CMAKE\u CXX\u标准
值,它们是
98、11和14
。 如果您通过了CXX\U标准11,并且您的编译器不支持c++11
CXX\u标准
自动变为98,cmake不会给您任何 如果所需的
CXX\u标准
OFF
或未设置,则出现错误。 如果您在“CXX\u标准”上设置了“CXX\u标准”
特定值成为构建和处理此问题的必需属性

为了使用
CHECK\u CXX\u COMPILER\u标志
,您需要包括checkcxcompilerflag模块:

include(CheckCXXCompilerFlag)
CHECK_CXX_COMPILER_FLAG("-std=c++11" COMPILER_SUPPORTS_CXX11)
if(COMPILER_SUPPORTS_CXX11)
    message(STATUS "${COMPILER_SUPPORTS_CXX11}")
else(COMPILER_SUPPORTS_CXX11)
    message(FATAL_ERROR "${COMPILER_SUPPORTS_CXX11}")
endif(COMPILER_SUPPORTS_CXX11)
如果你有一个旧的cmake,你需要处理复杂的,不可移植的标志 来自编译器sush,具体如下:

function(suported_compilers)
  if("${CMAKE_CXX_COMPILER_ID}" MATCHES "GNU")
    execute_process(
      COMMAND ${CMAKE_CXX_COMPILER} -dumpversion OUTPUT_VARIABLE GCC_VERSION)
    if(NOT(GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7))
      message(FATAL_ERROR "${PROJECT_NAME} requires g++ 4.7 or greater.")
    endif(NOT(GCC_VERSION VERSION_GREATER 4.7 OR GCC_VERSION VERSION_EQUAL 4.7))
  elseif("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
  else()
    message(FATAL_ERROR "Your compiler is supported in the build set?, please "
                  "contact the maintainer.")
  endif()
endfunction(suported_compilers)
function(set_targets_compilers_flags target_list)
  suported_compilers()
  foreach(tg ${target_list})
    if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" OR "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
      set_target_properties(${tg} PROPERTIES COMPILE_FLAGS "-g -std=c++14 -Wall -Wextra -Werror")
    elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
      set_target_properties(${tg} PROPERTIES COMPILE_FLAGS "/W4 /WX /EHsc")
    endif()
  endforeach()
endfunction(set_targets_compilers_flags)

在早于3.1的CMake版本中,我们使用

 add_compile_options(-std=c++11) # CMake 2.8.12 or newer
如中所述,向编译器调用添加编译选项

这可能不像Alvaro的答案中那样具有可移植性,但它更具可读性,而且因为您使用的是RasPi,我想GCC和Clang就像目标编译器一样

编辑:为了完整性:在CMake版本3.1及更新版本中,如果要强制使用C++11,需要以下几行:

set(CMAKE_CXX_STANDARD 11) # C++11...
set(CMAKE_CXX_STANDARD_REQUIRED ON) #...is required...
set(CMAKE_CXX_EXTENSIONS OFF) #...without compiler extensions like gnu++11
这将在编译期间为遵循此声明的所有目标启用选项。如果您想更细粒度地控制这一点,请参阅Alvaro的答案或
set\u taget\u properties()
的CMake文档,其内容如下:

set_target_properties(myTarget PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS OFF
)

编辑:但请注意,GCC4中对C++11的支持并不完整,可能存在与定义标准不同的行为。

由于当前的cmake版本是3.10,我认为可能适合确定较新的方法。而建议使用add_编译器_

对于在这里查看更现代版本的cmake(3.1+)的任何人来说,最合适的答案不是确定给定编译器的版本,而是让cmake知道需要哪些功能可用

target_compile_features(engine
    PRIVATE cxx_range_for
    )

我意识到我只有CMAKE 3.0.2,我链接的文档是针对CMAKE 3.1的,也许它不支持CXX_标准属性?我最终使用的是“set(CMAKE_CXX_FLAGS“${CMAKE_CXX_FLAGS}-std=c++11”),这对我来说很有用。CMAKE的更高版本会使用set_属性方法吗?其中一个比另一个有好处吗?CXX_标准在3.1版本中是新的供参考。您的部分困难在于C++03是GCC 4.x的默认版本,而4.7是第一个支持C++11的版本。当你拥有GCC 5。x,C++ 11将是默认的,GCC 6。x C++ 14将是默认的。@默认情况下,MatcSuuChARGcc5仍然使用<代码> GNU+03 < /COD> C++。但是,C.GCC6的代码> GNU11<代码>切换到 GNU+14 作为默认C++模式。这将覆盖用户在其shell中已经设置为某个自定义值的变量。如果您想使用它,可以这样做:
set(CMAKE\u CXX\u FLAGS“${CMAKE\u CXX\u FLAGS}”-std=c++11”)
…但一般来说,您更喜欢更“现代”的方法,如
add\u compile\u option()
CXX\u标准变量。:)有一个更现代的功能:您可以请求特定的功能,cmake将自动为编译器提供标志。@Ilyapov:谢谢您的提示。不过,不确定它是否更现代。它确实更细粒度,但它是与
cmake\u C同时引入的XX_STANDARD
和friends…。此外,我还尝试为这个特定案例找到一个功能关键字(用于使用
来搜索字符串
)但我找不到它了。我想把它添加到答案中,但是我只能把它放在具体的东西上。过时了。对于一个带有本地C++代码的Android分级项目来说,它是行不通的。现在CMAX的最新版本是3.15。@ ZWORKY不知道Android或Gradle,但是<代码> CXXIX标准和<代码> CMACHYCXXX标准< /代码>直到与CMake 3.15合作。
target_compile_features(engine
    PRIVATE cxx_range_for
    )