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

Posted 10km

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了cmake:通过CMAKE_CXX_COMPILE_FEATURES判断编译器是否支持C++11相关的知识,希望对你有一定的参考价值。

以前在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++11的主要内容,如果未能解决你的问题,请参考以下文章

MSVC 不通过 cmake 生成 lib

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

通过make运行时找不到CMake

如何通过cmake用-fPIC编译jsoncpp

linux vscode通过cmake或g++调试程序

CMake简易入门