我有一个基于CMake的小型C++11库,可以通过使用一些C++14和C++17功能来改进。
为此,我希望CMake测试是否在列表CMAKE_CXX_COMPILE_FEATURES中包含cxx_std_14
和/或cxx_std_17
,正如相关SO问题如何使用CMake检测编译器对C++11支持中所示。
然而,我无法完全弄清楚如何编写此测试。我认为应该可行的方法并不奏效:
list (FIND ${CMAKE_CXX_COMPILE_FEATURES} "cxx_std_14" _index)
if (${_index} GREATER -1)
message("YAY 14")
else()
message("NAY 14")
endif()
# -> CMake Error .... (list):
# list sub-command FIND requires three arguments
因为最低CMake版本是2.8.7,所以我必须使用list(FIND ...)而不是更新、更简洁的IN_LIST。
CMAKE_CXX_COMPILE_FEATURES
看起来像是由分号分隔的字符串,因此这个丑陋的代码片段可以正常工作:
if ("${CMAKE_CXX_COMPILE_FEATURES}" MATCHES "cxx_std_14")
message("YAY 14")
else()
message("NAY 14")
endif()
当然,这不是正确的做法......如有帮助,将不胜感激。
#ifdef if __cplusplus > 201402L
等方式,而要使用 CMake 呢? - einpoklumlist
命令接受 列表名称,而不是其内容。正确的用法是:list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_str_14" _index)
。 - Tsyvarev__cplusplus
并不是一种可靠的方法。 - mcmayer