cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11

2022-04-13 12:36:06 浏览数 (1)

以前在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变量,判断编译支持的标准就变得很简单可靠了:

代码语言:javascript复制
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》

0 人点赞