cmake不会编译为C++ 11标准

DrT*_*arr 9 c++ cmake c++11

我是C++的新手,并且一直在努力编译/制作/链接/构建/无论如何,让我们看看有人可以帮助我.我做了一些搜索,发现其他人有类似的问题,但我尝试了他们的解决方案没有运气,所以这里是:

一个使用C++ 11功能的简单c ++程序,如统一初始化,线程to_string等......会产生错误,"xxx"未在范围内声明.特别是现在我想使用to_string,并在std命名空间中使用它或专门std::to_string创建错误"to_string"不是STD的成员.很明显它不是用C++ 11编译的.

所以这是我的make文件:

#####################################
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()
#####################################
Run Code Online (Sandbox Code Playgroud)

正如你所看到的,我正在使用覆盆子pi玩OpenCV.但是,如果没有C++ 11函数,程序将编译并运行没有问题.但我想从C++ 11中添加线程和其他好东西.我set_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED 11)根据CMAKE文档添加了该行:

https://cmake.org/cmake/help/v3.1/prop_tgt/CXX_STANDARD.html

并且它产生的错误没有区别.我先做了它没有_REQUIRED,然后用它.我也尝试了,target_compile_features()但CMAKE返回了"未知的CMAKE命令".

其他细节: - 在Rasberry上编译pi 3运行debian jessie -CXX编译器是GNU 4.9.2 -CMAKE 3.0.2

Bug*_*ger 30

3.1之前的 CMake版本中,我们使用

 add_compile_options(-std=c++11) # CMake 2.8.12 or newer
Run Code Online (Sandbox Code Playgroud)

将编译选项添加到编译器调用中,如CMake Docs中所述.

这可能不像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
Run Code Online (Sandbox Code Playgroud)

这将在编译期间为所有目标启用选项.如果你想控制更细粒度,请参阅Alvaro的答案或CMake Docs set_taget_properties(),然后看起来像这样:

set_target_properties(myTarget PROPERTIES
    CXX_STANDARD 11
    CXX_STANDARD_REQUIRED ON
    CXX_EXTENSIONS OFF
)
Run Code Online (Sandbox Code Playgroud)

编辑:但要注意GCC 4中的C++ 11支持不完整,并且可能存在与定义的标准不同的行为.