我有一个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
,那是否足以触发重建或者我是否需要新的构建目录?
答案 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
的首次调用与以后的 不同<(从命令行中设置选项的视图) ):
首次调用:
-DOPTION=VALUE
)中给出了选项的值,则使用此值。以后的调用:
-DOPTION=VALUE
)中给出了选项的值,则使用此值。-UOPTION
),则使用默认值。因此,已经完成了一次cmake
调用,可以:
修改部分选项并保留其他不变
为此,请使用-D
传递已修改选项的值。
重置部分选项并保留其他不变
为此,请使用-U
传递重置选项的值。
设置部分选项,并将其他选项重置为默认值
为此,请通过从构建目录中删除CMakeCache.txt
或从构建目录中删除所有文件来进行 clean 重建。
要为项目中的选项指定默认值,请使用常见的 CACHE 变量:
set(CMAKE_CXX_STANDARD 11 CACHE STRING "C++ standard to be used")