【问题标题】:GCC 11: How to tell CMake I don't want the default C++ GNU extensions?GCC 11:如何告诉 CMake 我不想要默认的 C++ GNU 扩展?
【发布时间】: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_REQUIREDcxx_std_NN 编译器功能 AFAIK 是多余的
  • 嗯,看起来 CMake 3.20.2 确实比 GCC 11 早,谢谢! (尽管已经宣布 GCC 11 将 C++ 默认设置为 C++17,但 cmake 并不是完全没有意识到这一点,因为它在第一种情况下主动省略了 -std=gnu++17。)
  • 好吧,既然您使用的是 最新 版本,可能仍然值得打开一个问题,以便问题在 下一个 版本中消失。

标签: c++ gcc cmake c++17


【解决方案1】:

这个问题的答案是它是 CMake 3.21 中的一个错误(但技术上不是 3.20,它比所讨论的编译器更老)将在 3.22 中修复,很可能通过以下合并请求:https://gitlab.kitware.com/cmake/cmake/-/merge_requests/6177

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-10
    • 2010-12-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多