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 许可协议
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 许可协议
检查编译器是否支持标志?也许像
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 许可协议
3 回答1.1k 阅读✓ 已解决
1 回答959 阅读✓ 已解决
4 回答750 阅读
1 回答827 阅读
1 回答862 阅读
1 回答626 阅读
1 回答733 阅读
当想要指定特定的 C++ 版本时,推荐使用 CMake 3.1 及更高版本执行此操作的方法是使用
CXX_STANDARD
、CXX_STANDARD_REQUIRED
和CXX_EXTENSIONS
或其变量等价物来指定目标默认值。完整的细节可以在 这里 找到,但简短的版本是这样的:然后,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
设置,都支持 —。