将 CMAKE_CXX_STANDARD 设置为各种值

Bar*_*rry 10 c++ cmake

我有一个 C++ 库,旨在用于多个编译器版本和多个 C++ 标准。我有这个库的测试 - 我需要确保这些测试通过我希望支持的编译器/版本矩阵。

我可以-DCMAKE_CXX_STANDARD=xx在命令行上提供(对于 11、14、17),这似乎工作正常。如何为此字段提供默认值?我希望,如果用户未提供,则默认值为 11。似乎当我这样做时:

$ CXX=/path/to/gcc-7 cmake .. -DCMAKE_CXX_STANDARD=17
# does stuff, CMAKE_CXX_STANDARD is 17

$ CXX=/path/to/gcc-7 cmake .. 
# does stuff, CMAKE_CXX_STANDARD is still 17
Run Code Online (Sandbox Code Playgroud)

这对我来说是违反直觉的。有没有办法让后者使用所需的默认值 11?

另外,如果我只是cmake在同一个构建目录中使用不同的值重新运行,这是否足以触发重建或者我是否需要一个新的构建目录?

usr*_*567 5

您可以使用该[option][1]命令让用户自己选择并给出默认值:

option(Barry_CXX_STANDARD "C++ standard" 11)
set(CMAKE_CXX_STANDARD Barry_CXX_STANDARD)
Run Code Online (Sandbox Code Playgroud)

变量名称Barry_CXX_STANDARD表示它特定于您的项目,并且应该与所有项目特定变量的命名前缀相同。
这种方法的缺点是,有经验的 CMake 用户会感到惊讶并CMAKE_CXX_STANDARD直接设置。

另一种方法是检查变量是否设置。

if(NOT "${CMAKE_CXX_STANDARD}")
  set(CMAKE_CXX_STANDARD 11)
endif()
Run Code Online (Sandbox Code Playgroud)

如果 CMake 已经提供了一个变量,我会使用第二种方法。如果它只是您的项目特定变量,则第一个更好。

无论如何,如果您想更改该值,您必须删除CMakeCache.txt构建目录中的 。否则缓存会隐藏更改。

  • 第一种方法似乎行不通。当在命令行中未指定 Barry_CXX_STANDARD 时,我得到的是 OFF 值而不是 11。文档指出,“option”仅适用于 ON/OFF 值:https://cmake.org/cmake/help/latest/command/option。 html (2认同)

Tsy*_*rev 5

在CMake的世界里,第一个调用cmake 不同后来者(从设置在命令行选项的视图):

  1. 第一次调用:

    • 如果在命令行( -DOPTION=VALUE) 中给出了选项的值,则使用该值。
    • 如果命令行中没有给出选项的值,则使用默认值。
  2. 后期调用:

    • 如果在命令行( -DOPTION=VALUE) 中给出了选项的值,则使用该值。
    • 如果命令行中未给出选项的值,则使用先前的值
    • 如果选项未设置( -UOPTION),则使用默认值

因此,cmake已经完成了一个调用,可以:

  • 修改一些选项,其他不变

    为此,将修改后的选项的值传递给-D.

  • 重置一些选项并保持其他不变

    为此,将重置选项的值传递给-U.

  • 设置一些选项,并将其他选项重置为默认

    为此,请通过从构建目录中删除或从构建目录中删除所有文件来进行干净的重建CMakeCache.txt


要为项目中的选项分配默认值,请使用常见的CACHE变量:

set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used")
Run Code Online (Sandbox Code Playgroud)