以前在cmake中要判断一个编译器是否支持C++11挺麻烦的,要根据编译器的类型和版本来判断。
从cmake 3.1版本开始增加了一个CMAKE_CXX_COMPILE_FEATURES变量用于获取当前C++ 编译器支持的编译特性列表,列表中是一些定义在CMAKE_CXX_KNOWN_FEATURES(C++已知特性)中的特性名字,比如cxx_lambdas即为当前编译器支持lambda表达式。
从cmake 3.8版本开始,cmake可识别的编译特性增加了代表C++标准的特性名:cxx_std_98,cxx_std_11,cxx_std_14,cxx_std_17
最新的cmake 3.23版本还增加了cxx_std_20,cxx_std_23《High level meta features indicating C++ standard support》
有这个CMAKE_CXX_COMPILE_FEATURES变量,判断编译支持的标准就变得很简单可靠了:
cmake_minimum_required( VERSION 3.8 )
project(myprj VERSION 1.0.0 LANGUAGES C CXX)
# 输出CMAKE_CXX_COMPILE_FEATURES内容
#message("Your C++ compiler supports these C++ features:")
# foreach(i ${CMAKE_CXX_COMPILE_FEATURES})
# message("${i}")
# endforeach()
# list命令在CMAKE_CXX_COMPILE_FEATURES 查找 cxx_std_11 ,
# 如果能找到就说明编译支持C++11
# 否则报错退出
list(FIND CMAKE_CXX_COMPILE_FEATURES cxx_std_11 _cxx11_enable)
if(_cxx11_enable)
message(STATUS "C++ 11 supported")
else()
message(FATAL_ERROR "Compiler not supported C++ 11 standard")
endif()
unset(_cxx11_enable)
参考资料
《How to detect C++11 support of a compiler with CMake》
《CMAKE_CXX_COMPILE_FEATURES》
《CMAKE_CXX_KNOWN_FEATURES》

本文介绍了如何利用CMake的CMAKE_CXX_COMPILE_FEATURES变量来判断C++编译器是否支持C++11及以上标准。从CMake3.1版本开始,该变量提供了编译器支持的特性列表,而从CMake3.8版本起,可以直接通过特性名如cxx_std_11来检查C++11支持。示例代码展示了如何检查C++11支持,并在不支持时给出错误提示。这种方法使得检测编译器标准支持变得简单可靠。
3053

被折叠的 条评论
为什么被折叠?



