(这个问题实际上是关于“或以后的”部分。)
我知道其他答案,这些答案告诉我们在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或更高版本的正确方法是什么?
答案 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"