如何从 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(...)
目前我有一个需要 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(...)