CMake 版本设置:我是否应该使用 CMAKE_CXX_STANDARD 或 `CXX_STANDARD` 在我的项目根目录 `CMakeLists.txt` 文件中设置 `C++` 版本?

CMake Version setting: Am I suppose to set the `C++` version in my project-root `CMakeLists.txt` file using CMAKE_CXX_STANDARD, or `CXX_STANDARD`?

这可能是个愚蠢的问题。如果它是重复的,我找不到它。

我是 CMake 的新手,我第一次接触它是通过 JetBrains IDE: CLion。我搬到了 VSCode,因为我觉得在任何其他环境中都不像 VSCode 那样舒适或配备齐全。不幸的是,在真正的 IDE 中构建项目通常更容易,尤其是在 VS2022 中。在 VSCode 中,我必须自己配置大部分内容,但实际上,我通过这种方式学到了更多,所以我不介意。所以我通常通过 project-root: CMakeLists.txt[=62 设置我使用的 C++ 版本=].刚才我去开始一个新项目时,虽然我注意到 Intellisense/Intellicode 弹出了一些东西,但我可以选择两个选项:


  1. CMAKE_CXX_STANDARD <ver>

  2. CXX_STANDARD <ver>


我已经使用 CMAKE_CXX_STANDARD 17 大约一年半了,从未见过没有前缀 "CMAKE_" 的设置版本.当我 google 它时,我只找到 CMAKE_CXX_STANDARD 设置的结果,考虑到语法几乎相同,这并不奇怪。

此外,我都试过了,我没有注意到有什么不同,但是当我不添加配置时,我并没有真正注意到有什么不同。我只是想知道有什么区别,如果有的话,所以我知道要使用哪个,更重要的是为什么要使用它。



下面的 img 显示了 V.S 中 C_CPP Microsoft IntelliSense 扩展的建议。代码.




注意:

行:set(CXX_STANDARD) 格式错误,它应该看起来像这样: set(CXX_STANDARD 17)

您可以使用 CMAKE_CXX_STANDARDCXX_STANDARD 中的任何一个,但请注意它们是 不同的实体:

  1. CMAKE_CXX_STANDARD是一个变量,所以可以用set命令设置:

    set(CXX_STANDARD_REQUIRED 17)
    

    此设置会影响所有 executable/library 个目标之后创建。

  2. CXX_STANDARD是一个目标属性,所以可以用set_property或[=17=设置] 命令:

    set_property(TARGET my_target PROPERTY CXX_STANDARD 17)
    

    此设置应在创建目标后执行my_target并且仅影响给定的目标。


尝试将 属性 设置为变量:

set(CXX_STANDARD 17)

只是错误:它设置了一个变量 CXX_STANDARD,而这个变量从未使用过 由 CMake。