以前在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》