将CMAKE_CXX_STANDARD设置为各种值

时间:2017-12-29 17:55:44

标签: 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

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

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

2 个答案:

答案 0 :(得分:4)

您可以使用option(Barry_CXX_STANDARD "C++ standard" 11) set(CMAKE_CXX_STANDARD Barry_CXX_STANDARD) 命令让用户自己选择并提供默认值:

Barry_CXX_STANDARD

变量名CMAKE_CXX_STANDARD表示它特定于您的项目,并且应该与所有项目特定变量的名称相同。 这种方法的缺点是,有经验的CMake用户会感到惊讶并直接设置if(NOT "${CMAKE_CXX_STANDARD}") set(CMAKE_CXX_STANDARD 11) endif()

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

CMakeCache.txt

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

在任何情况下,如果要更改值,则必须删除构建目录中的{{1}}。否则,缓存会隐藏更改。

答案 1 :(得分:3)

在CMake世界中,cmake 首次调用以后的 不同<(从命令行中设置选项的视图) ):

  1. 首次调用:

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

    • 如果在命令行(-DOPTION=VALUE)中给出了选项的值,则使用此值。
    • 如果未在命令行中提供选项的值,则使用上一个值
    • 如果选项未设置-UOPTION),则使用默认值
  3. 因此,已经完成了一次cmake调用,可以:

    • 修改部分选项并保留其他不变

      为此,请使用-D传递已修改选项的值。

    • 重置部分选项并保留其他不变

      为此,请使用-U传递重置选项的值。

    • 设置部分选项,并将其他选项重置为默认

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

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

    set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used")