【发布时间】:2021-08-10 22:22:20
【问题描述】:
所以,回到 GCC 10.2(默认使用 C++14),我可以用它告诉 CMake 我想要-std=gnu++17:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
)
...我实际上不想要,所以我使用CXX_EXTENSIONS OFF 强制-std=c++17:
target_compile_features(mytarget PRIVATE cxx_std_17)
set_target_properties(mytarget PROPERTIES
CXX_STANDARD_REQUIRED ON
CXX_EXTENSIONS OFF # -std=c++17 instead of gnu++17
)
进入 GCC 11.1。现在默认的是 ISO C++ 标准的 2017 版本,因此上面的第一个 sn-p 不会为 GCC 生成 any -std 标志,这与 GCC 11 的手册页兼容:
c++17:2017 ISO C++ 标准及修正版。
gnu++17:-std=c++17的 GNU 方言。这是 C++ 代码的默认设置。
问题是上面的第二个 CMake sn-p 也没有生成任何-std 标志。我现在该怎么做,这是 CMake 中的错误吗?如何告诉它我想要一个明确的 -std=c++17 标志?
备注 1:我知道我可以将 -std=c++17 粘贴到 target_compile_options 中,但我不想这样做,不是吗?
备注2:健全性检查:如果我将cxx_std_17更改为cxx_std_20,那么CXX_EXTENSIONS OFF正确地从-std=gnu++2a切换到-std=c++2a。
【问题讨论】:
-
您使用的是什么版本的 CMake?它比 GCC 11.1 更新吗?规则是你不应该使用比你的编译器更旧的 CMake 版本。如果您使用的是足够新的版本,那么是的,这是一个错误。
-
另外,
CXX_STANDARD_REQUIRED与cxx_std_NN编译器功能 AFAIK 是多余的 -
嗯,看起来 CMake 3.20.2 确实比 GCC 11 早,谢谢! (尽管已经宣布 GCC 11 将 C++ 默认设置为 C++17,但 cmake 并不是完全没有意识到这一点,因为它在第一种情况下主动省略了
-std=gnu++17。) -
好吧,既然您使用的是 最新 版本,可能仍然值得打开一个问题,以便问题在 下一个 版本中消失。