如何在CMake目标上请求C ++ 11或更高版本?

时间:2019-01-16 09:09:02

标签: c++ cmake

(这个问题实际上是关于“或以后的”部分。)

我知道其他答案,这些答案告诉我们在cmake中的目标/项目上激活C ++ 11。

我的问题实际上是我们如何表达C ++ 11或更高版本。

从CMake 3.8开始,我们具有cxx_std_11功能,可在编译器(-std=c++11)上强制使用C ++ 11,该编译器甚至支持更高的标准,甚至可能默认为C ++ 14(gcc-7 )甚至17(gcc-8,iiuc)。

还有CXX_STANDARD-target-property,但这不是可传递的,并且会强制使用确切的标准,而不是“或更高”选项。

到目前为止,我发现的唯一方法是需要cxx_range_for(或类似功能),如果至少支持C ++ 11,CMake会保留编译器的默认C ++标准。从CMake 3.1开始支持。

选择CMake目标的C ++ 11或更高版本的正确方法是什么?

2 个答案:

答案 0 :(得分:1)

不幸的是,无法在CMake中要求范围标准。

然后(我过去使用过的)唯一方法是使用check_cxx_compiler_flag检查-std=c++20-std=c++17-std=c++14-std=c++11(按此顺序),并使用最高的值,例如target_compile_options

如果不支持列出的所有标志,则错误提示。

答案 1 :(得分:0)

正如@Some程序员伙计所指出的那样,唯一的方法是先检查C ++ 17,然后是C ++ 14,然后是C ++ 11。研究CMake源本身会给出有趣的想法,如何以与平台无关的方式进行操作。在这里try_compile command与相应的CMAKE_CXX_STANDARD一起使用,因此CMake本身确定应使用哪个编译器标志。因此要检查C ++ 14:

try_compile(CMake_CXX14_WORKS
  ${CMAKE_CURRENT_BINARY_DIR}
  ${CMAKE_CURRENT_LIST_DIR}/cm_cxx14_check.cpp
  CMAKE_FLAGS -DCMAKE_CXX_STANDARD=14
  OUTPUT_VARIABLE OUTPUT
  )

其中cm_cxx14_check.cpp是带有main的伪文件。

这是这里的关键思想,尽管完整的逻辑还会检查是否尚未定义CMAKE_CXX_STANDARD或CMake是否知道CMAKE_CXX_STANDARD=17(CMake> = 3.8)。另外,CMake仅检查GNU或Clang的最新标准,但是我相信这是因为MSVC中非库代码不需要它。默认情况下,MSVC始终启用最新标准。

不幸的是,这也是GNU 4.8的一个极端案例:"The GNU 4.8 standard library's cstdio header is not aware that C++14 honors C11's removal of "gets" from stdio.h and results in an error"