Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何申请C++;11或更高版本的CMake目标?_C++_Cmake - Fatal编程技术网

C++ 如何申请C++;11或更高版本的CMake目标?

C++ 如何申请C++;11或更高版本的CMake目标?,c++,cmake,C++,Cmake,(这个问题实际上是关于“或以后”部分。) 我知道其他答案告诉我们在cmake的目标/项目上激活C++11 我的问题是如何表达C++11或更高版本。 从CMake 3.8开始,我们就有了cxx\u std\u 11-功能,它强制C++11安装在编译器上(-std=C++11),甚至支持更高的标准,甚至可能默认为C++14(gcc-7)甚至17(gcc-8,iiuc) 还有CXX_STANDARD-target-property,但这不是可传递的,也强制使用确切的标准,而不是“或更高版本”选项 到目

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

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

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

从CMake 3.8开始,我们就有了
cxx\u std\u 11
-功能,它强制C++11安装在编译器上(
-std=C++11
),甚至支持更高的标准,甚至可能默认为C++14(gcc-7)甚至17(gcc-8,iiuc)

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

到目前为止,我找到的唯一方法是为(或类似功能)要求使用
cxx\u range\u,这使得CMake在至少支持C++11的情况下保持编译器的默认C++标准。这在CMake 3.1中得到支持


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

不幸的是,在CMake中没有办法要求一系列标准

那么唯一的方法(我在过去使用过)就是使用例如来检查
-std=c++20
-std=c++17
-std=c++14
-std=c++11
(按该顺序)并使用最高的


如果不支持列出的任何标志,则会出错。

正如@someprogrammer dude指出的,唯一的方法是检查C++17,然后是C++14,然后是C++11。通过查看CMake源代码本身,可以了解到如何以平台无关的方式实现这一点。在这里与通过的相应CMAKE_CXX_标准一起使用,因此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\u CXX\u标准
是否尚未定义,或者CMAKE是否知道
CMAKE\u CXX\u标准=17
(CMAKE>=3.8)。另外,CMake只检查GNU或Clang的最新标准,但我相信这是因为MSVC中的非库代码不需要它。默认情况下,MSVC始终启用最新标准


不幸的是,在GNU4.8中也有一些特殊情况:

使用不同的标准构建项目的不同部分不是一个好主意。如果您的源代码是C++11,为什么要使用更高的标准来编译它?请注意,较新的标准不是100%向后兼容的。对于仅标头的库,如果它也适用于更高版本,您可能不希望强制依赖项使用C++11。这是我的用例。好主意,但这不是平台不可知的。@PatrickB。不幸的是没有。这适用于三大编译器中的两个(GCC和Clang),您可以添加MSVC检查,以类似的方式检查其特定标志和标准选项。这也适用于自2015年更新3以来的所有MSVC版本,因为当时Microsoft在编译器中添加了对这些命令行开关的支持。