如何让 CMake 基于 GCC 版本通过 std=c 14/c 1y 或 c 17/c 1z?

新手上路,请多包涵

GCC 4.x 不接受用于 C++14 代码的 --std=c++14 开关 - 它需要 --std=c++1y 代替。更高版本采用 --std=c++1z 但(可能)不是 --std=c++17 尚未设置(在 2016 年编写)。也许 C++11 也有类似的问题。

CMake 是否有一些工具(可能作为一个模块)来根据 GCC 版本传递正确的开关?

原文由 einpoklum 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.6k
2 个回答

当想要指定特定的 C++ 版本时,推荐使用 CMake 3.1 及更高版本执行此操作的方法是使用 CXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONS 或其变量等价物来指定目标默认值。完整的细节可以在 这里 找到,但简短的版本是这样的:

 cmake_minimum_required(VERSION 3.1)
project(Example)

set(CMAKE_CXX_STANDARD 14)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
# ... Define targets, etc. as usual

然后,CMake 应该根据编译器支持的内容为请求的 C++ 标准选择适当的编译器标志,或者如果它不支持请求的标准,则会出错。

还应该注意的是,CMake 可能会升级目标以使用比其 CXX_STANDARD 目标属性指定的语言标准更高的语言标准。使用 编译功能要求(如@FlorianWolters 回答中所述)可以提高语言标准要求。事实上,CMake 将始终选择由 CXX_STANDARD 目标属性或目标上设置的编译功能要求指定的更强的语言要求。另请注意,早期版本的 CMake 文档并未准确反映 CXX_EXTENSIONS 与编译功能交互的方式。对于 CMake 3.21 或更早版本,对于大多数常见的编译器(因为它们与一个编译器标志一起指定), CXX_EXTENSIONS 只有在 CXX_STANDARD 也被指定时才会生效。从 CMake 3.22 开始,无论 CXX_STANDARD CXX_EXTENSIONS 设置,都支持 —。

原文由 Craig Scott 发布,翻译遵循 CC BY-SA 4.0 许可协议

检查编译器是否支持标志?也许像

include(CheckCXXCompilerFlag)

# Check for standard to use
check_cxx_compiler_flag(-std=c++17 HAVE_FLAG_STD_CXX17)
if(HAVE_FLAG_STD_CXX17)
    # Have -std=c++17, use it
else()
    check_cxx_compiler_flag(-std=c++1z HAVE_FLAG_STD_CXX1Z)
    if(HAVE_FLAG_STD_CXX1Z)
        # Have -std=c++1z, use it
    else()
        # And so on and on...
    endif()
endif()

原文由 Some programmer dude 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题