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。)
解决方案是删除该 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_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)
| 归档时间: |
|
| 查看次数: |
4230 次 |
| 最近记录: |