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
)