【发布时间】:2020-11-04 17:37:57
【问题描述】:
我有一个基于 cmake 的小型 C++11 库,可以通过使用一些 C++14 和一些 C++17 特性来改进它。
为此,我希望 CMake 测试 cxx_std_14 和/或 cxx_std_17 是否在列表 CMAKE_CXX_COMPILE_FEATURES 中,正如相关 SO 问题 How to detect C++11 support of a compiler with CMake 中所暗示的那样。
不过,我不太清楚如何编写这个测试。我认为应该有效,但没有:
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 似乎是一个分号分隔的字符串,所以这个丑陋的 sn-p 有效:
if ("${CMAKE_CXX_COMPILE_FEATURES}" MATCHES "cxx_std_14")
message("YAY 14")
else()
message("NAY 14")
endif()
当然,这不是正确的做法...任何帮助将不胜感激。
【问题讨论】:
-
如果是库,难道你不想迎合目标系统的编译器而不是库构建系统的编译器吗?例如为什么要使用 CMake 而不是
#ifdef if __cplusplus > 201402L等? -
list命令接受列表名称,而不是其内容。正确用法是:list(FIND CMAKE_CXX_COMPILE_FEATURES "cxx_str_14" _index). -
@einpoklum 据我了解,
__cplusplus对于检测 C++14 或 C++17 而言(跨平台和编译器)并不确定。 -
@Tsyvarev Aah... 确实如此。
-
@mcmayer:你错了……这个宏is an official part of the standard;如果编译器不提供它,这意味着它不可靠地支持标准。无数的库(可能包括标准库)都依赖它。