如何确定给定编译标志的 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 的最小/最大版本?的主要内容,如果未能解决你的问题,请参考以下文章

如何检索用于编译给定 ELF 可执行文件的 GCC 版本?

centos最小发行版包含gcc吗

指定 O2 标志时 gcc 链接到错误的 GLIBCXX 版本

何时为 gcc 使用 -O2 标志?

[青铜装备] 如何手动安装老版本gcc编译器

在研究缓冲区溢出时,我应该使用哪些版本的 GCC 或标志?