如何从 CMake 命令行更改 C++ 标准?

alf*_*lfC 7 c++ cmake c++17 c++20

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

set(CMAKE_CXX_STANDARD 17)
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

(我在 3.18 左右使用 cmake。)

Gui*_*cot 7

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

# set(CMAKE_CXX_STANDARD 17)
target_compile_features(myexecutable PUBLIC cxx_std_17)
Run Code Online (Sandbox Code Playgroud)

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

  • *“所有以 CMAKE_xxxxx 开头的变量通常都意味着在终端中使用,”* 有大量带有“CMAKE_”前缀的变量,但事实并非如此。不过推荐还是不错的... (2认同)
  • @alfC `add_library(common-properties INTERFACE)` 然后 `target_compile_feature(common-properties INTERFACE cxx_std_17)` 然后 `target_link_libraries(myexecutable PUBLIC common-properties)` (2认同)
  • @alfC 使用 `add_library(common-properties INTERFACE)` 创建的目标的名称。如果您愿意,您可以将其称为“potato”,“common-properties”是一个虚构的名称。 (2认同)

fab*_*ian 5

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

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

add_library(...)
Run Code Online (Sandbox Code Playgroud)

使用cmake -D CMAKE_CXX_STANDARD=20 binary_dir应该允许您现在更新标准,cmake -U CMAKE_CXX_STANDARD binary_dir应该恢复到默认值。


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

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(...)
Run Code Online (Sandbox Code Playgroud)