gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 12:29:38 39 4
gpt4 key购买 nike

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

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

最佳答案

当想要指定特定的 C++ 版本时,推荐使用 CMake 3.1 及更高版本执行此操作的方法是使用 CXX_STANDARDCXX_STANDARD_REQUIREDCXX_EXTENSIONS 目标属性,或它们的变量等效项以指定目标默认值。完整详情可查看 here ,但简短的版本是这样的:

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 目标属性指定的语言标准更高的语言标准。使用compile feature requirements (如@FlorianWolters 回答中所述)可以提高语言标准要求。事实上,CMake 将始终选择由 CXX_STANDARD 目标属性或目标上设置的编译功能要求指定的更强的语言要求。另请注意,早期版本的 CMake 文档并未准确反射(reflect) CXX_EXTENSIONS 与编译功能交互的方式。对于 CMake 3.21 或更早版本,CXX_EXTENSIONS 仅在还指定了 CXX_STANDARD 时才会生效,对于大多数常见的编译器(因为它们与一个编译器标志一起指定)。从 CMake 3.22 开始,无论是否设置了 CXX_STANDARD,都将遵循 CXX_EXTENSIONS

关于c++ - 如何让 CMake 基于 GCC 版本通过 std=c++14/c++1y 或 c++17/c++1z?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42834844/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com