【问题标题】:How to enable `/std:c++latest` in cmake?如何在 cmake 中启用`/std:c++latest`?
【发布时间】:2021-03-01 12:04:21
【问题描述】:

我可以将CMAKE_CXX_STANDARD 设置为17 以获取/std:c++17,但我不能将其设置为latest,可以吗?我想我可以用暴力破解它

if (MSVC)
    add_compiler_options(/std:c++latest)
endif()

当然,但是有没有一种惯用的方式来获取/std:c++latest,甚至可能与工具链无关?

编辑为什么会有人想要这个?与 Clang 和 GCC 不同,MSVC 似乎没有定义 /std:c++2a 来启用 C++17 后的特性。它只是为此使用/std:c++latest。如果我使用一组已知的编译器构建代码库,我知道我可以使用哪些 C++20 功能,但我需要告诉构建系统启用每个编译器能够执行的所有功能。

【问题讨论】:

  • 我不知道有任何编译器(或工具链)提供了这样的功能。大多数供应商希望用户了解并有意选择他们构建的标准(并且默认为他们支持稳定且接近完整的标准)。由于最新版本通常是开发性和不稳定的,因此选择最新版本确实适合知识渊博的高级开发人员,他们愿意并且能够应对语言或库的不完整或不正确的实现。这些开发人员可能会确切地知道他们希望使用的标准版本。
  • 变量 CMAKE_CXX_STANDARD 实际上是设置要使用的 C++ 版本的唯一“工具链无关”方式。不幸的是,它只允许特定的预定义值。此外,GCC 和 Clang 都没有“最新”的标准选项 IIRC。
  • 虽然我理解您想要此功能的动机,但它会严重破坏给定代码库和 CMake 构建系统的可移植性。 “最新”的定义将在不同的编译器甚至编译器版本之间发生显着变化。最好明确说明您想要哪个版本。
  • @Someprogrammerdude 为这个问题添加了理由,我意识到 Clang 和 GCC 只是使用不同的方式来启用最新的。对于那些编译器,你说-std=c++1z-std=c++2a,它们会永远存在,最终成为-std=c++17-std=c++20 的别名,分别。 /std:c++latest,otoh,是一个移动的目标。在 C++20 之后,它将成为 GCC 和 Clang 可能会调用的 -std=c++2b。我认为我更喜欢 GCC/Clang,因为 Botje 和 Peter 在他们的 cmets 中正确指出了原因。

标签: c++ visual-c++ cmake


【解决方案1】:

在 CMake 3.20.3 之前,如果您要求 C++20,使用 set(CMAKE_CXX_STANDARD 20),您将得到 -std:c++latest。证明:

  if (CMAKE_CXX_COMPILER_VERSION VERSION_GREATER_EQUAL 19.12.25835)
    set(CMAKE_CXX20_STANDARD_COMPILE_OPTION "-std:c++latest")
    set(CMAKE_CXX20_EXTENSION_COMPILE_OPTION "-std:c++latest")
  endif()

(来自 cmake 源中的 Modules/Compiler/MSVC-CXX.cmake)

更新:由于 CMake 3.20.4,set(CMAKE_CXX_STANDARD 20) 获取您 -std:c++20,因此您需要 set(CMAKE_CXX_STANDARD 23) 获取 -std:c++latest - 假设您的 MSVC 编译器版本是 16.11 Preview 1 或更高版本(请参阅 cmake commit 3aaf1d91bf353 )。

【讨论】:

    【解决方案2】:

    假设您使用的编译器已经与 C++20 兼容,并且您不想像之前的答案那样放置“if”和额外的赋值,这是放置最新版本的标准方法使用 Visual Studio 或其他编译器时使用 CMake 的 C++ 版本。

    target_compile_features(${PROJECT_NAME} PRIVATE cxx_std_20)
    

    以下是 C++ CMAKE_CXX_KNOWN_FEATURES 情况下 CMake 支持的功能列表。

    【讨论】:

      【解决方案3】:

      支持的值为 98、11、14、17 和 20。

      根据CMake Docs

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-14
        • 2018-01-23
        • 2023-01-17
        • 1970-01-01
        • 2021-01-02
        • 1970-01-01
        • 1970-01-01
        • 2015-04-01
        相关资源
        最近更新 更多