如何确定给定编译标志的 GCC 的最小/最大版本?
Posted
技术标签:
【中文标题】如何确定给定编译标志的 GCC 的最小/最大版本?【英文标题】:How to determine the min/max version of GCC for a given compilation flag? 【发布时间】:2021-10-12 10:04:13 【问题描述】:我添加了一个我在GCC Options Summary 找到的编译标志,结果发现 GCC 7 不知道那个(我们使用持续集成系统,其中许多版本一个接一个地启动,每个失败都意味着整个构建失败,我们无法构建下一个版本)。
该网站不包含每个选项的版本范围,因此,除了逐个测试每个编译器版本之外,是否有更简单的方法来获取此信息?
【问题讨论】:
【参考方案1】:创建一个小的有效测试程序并测试它是否使用测试标志编译。如果可以编译,则表示支持该标志。
存在用于简化此类工作的构建系统,例如 CMake check_c_compiler_flag
或 autotools ax_check_compile_flag
。
【讨论】:
这些方法告诉我它是否适用于构建期间使用的单个 gcc/g++ 版本。我正在寻找具体的文档,或者一次检查多个版本的方法。 有什么用?这不像您在构建期间使用许多 gcc 版本。如果不使用,为什么需要知道 gcc 版本 1.0.0 是否支持该标志?您说:we use Continuous Integration systems where many versions are started one after the other
- 对于每个版本,检查是否支持该标志,并使用它。这样问题就解决了。
我不认为它在文档中,您可以遍历 git 树并 grep 选项的每个标记版本,或者遍历每个 html 文档(如果选项已记录或未记录)。不遍历的唯一方法是检查发行说明,但有时那里没有提到该选项。无论哪种方式,您最终都会检查每个版本是否支持。使用该标志检查编译是一种概括,它也处理一些边缘情况。你也可以做穷人解决方案并做strings /usr/bin/gcc | grep -- --flag
哦,所以你的意思是标志是有条件的测试如果它工作,那么使用,对吧?通常使用生成器表达式将标志写入 CMakeLists,这需要正确的版本。猜猜我们当时一直都做错了。
right?
嗯,是的。像这样:gitlab.kitware.com/vtk/vtk/-/blob/master/CMake/…。它通常是一个模式check_cxx_copmiler_flag(flag VAR) if (VAR) add_compile_options(flag)
。 Often the flags are written in the CMakeLists using generator expressions
通常不使用生成器表达式,除非您正在处理多配置构建生成器。【参考方案2】:
刚刚找到这个。使用Compiler Explorer:
使用以下程序:int main()
您可以点击源代码上方的Add new...
> Conformance Viewer
并列出您支持的所有编译器并为每个编译器设置标志。
【讨论】:
以上是关于如何确定给定编译标志的 GCC 的最小/最大版本?的主要内容,如果未能解决你的问题,请参考以下文章