如何从 CMake 命令行提升 C++ 标准?

How to bump the C++ standard from the CMake command line?

目前我有一个需要 C++17 的项目,因此在 CMakeLists.txt 我很早就有了这一行:

set(CMAKE_CXX_STANDARD 17)

我偶尔想从命令行 (cmake) 测试该项目是否也可以使用 C++20 进行编译。 (为了避免意外)。

如何从命令行选择使用 C++20 进行编译?

如果我这样做 cmake -DCMAKE_CXX_STANDARD=20 然后它会被配置覆盖,而不是 17 被解释为最低要求。

我可以检查变量是否已预定义以避免覆盖,但我一直在寻找一种更明确的方式来指定它。

(我在 3.18 左右使用 cmake。)

解决方案是删除该设置命令并改用目标属性:

# set(CMAKE_CXX_STANDARD 17)
target_compile_features(myexecutable PUBLIC cxx_std_17)

然后,在终端上设置 -DCMAKE_CXX_STANDARD=20 应该会再次起作用。

CMAKE_CXX_STANDARD设为缓存变量。这使您可以轻松指定可以通过命令行覆盖的默认值。请注意,您需要确保没有“正常”CMAKE_CXX_STANDARD 变量可用,因为该值将优先于缓存变量。

set(CMAKE_CXX_STANDARD 17 CACHE STRING "the C++ standard to use for this project")

add_library(...)

使用 cmake -D CMAKE_CXX_STANDARD=20 binary_dir 应该可以让您现在更新标准,cmake -U CMAKE_CXX_STANDARD binary_dir 应该恢复为默认值。


或者,您可以创建自定义缓存变量。这将使重用更容易,因为它允许您覆盖 属性,即使其他人在使用 add_subdirectory 添加您的项目之前设置了 CMAKE_CXX_STANDARD

set(MYPROJECT_CXX_STANDARD 17 CACHE STRING "the C++ standard to use for myproject")

# overwrite possibly preexisting value for this directory and subdirectories
set(CMAKE_CXX_STANDARD ${MYPROJECT_CXX_STANDARD})

add_library(...)