【发布时间】:2016-06-03 18:38:58
【问题描述】:
我是 C++ 的新手,一直在努力编译/制作/链接/构建/任何东西,让我们看看是否有人可以帮助我。我做了一些搜索,发现其他人有类似的问题,但我尝试了他们的解决方案,但没有运气,所以这里是:
使用统一初始化、线程、to_string 等 C++ 11 功能的简单 c++ 程序会生成 "xxx" 未在范围内声明的错误。具体来说,现在我想使用to_string,并在std 命名空间或特别是std::to_string 中使用它会产生错误“to_string”不是STD 的成员。很明显它不是用 C++ 11 编译的。
这是我的制作文件:
#####################################
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_property(TARGET main PROPERTY CXX_STANDARD_REQUIRED 11)这一行:
https://cmake.org/cmake/help/v3.1/prop_tgt/CXX_STANDARD.html
这对生成的错误没有影响。我首先在没有_REQUIRED 的情况下完成了它,然后再使用它。我也尝试了target_compile_features(),但 CMAKE 返回了“未知的 CMAKE 命令”。
其他细节: - 在运行 debian jessie 的树莓派 3 上编译 -CXX 编译器是 GNU 4.9.2 -CMAKE 3.0.2
【问题讨论】:
-
我意识到我只有 CMAKE 3.0.2 并且我链接的文档是针对 CMAKE 3.1,也许它不支持 CXX_STANDARD 属性?我最终使用的是 "set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")" ,它对我有用。更高版本的 CMAKE 是否可以使用 set_property 方法?一个比另一个有优势吗?
-
CXX_STANDARD 是 3.1 中的新功能 cmake.org/cmake/help/v3.1/release/3.1.0.html#properties
-
仅供参考,部分困难在于 C++03 是 GCC 4.x 的默认值,而 4.7 是第一个支持 C++11 的版本。当您拥有 GCC 5.x 时,C++11 将是默认值,而 GCC 6.x C++14 将是默认值。
-
@MattSchuchard GCC5 仍然默认使用
gnu++03用于 C++,但gnu11用于 C。GCC6 切换到gnu++14作为默认 C++ 模式。