【问题标题】:How to determine the min/max version of GCC for a given compilation flag?如何确定给定编译标志的 GCC 的最小/最大版本?
【发布时间】:2021-10-12 10:04:13
【问题描述】:

我添加了一个我在GCC Options Summary 找到的编译标志,结果发现 GCC 7 不知道那个(我们使用持续集成系统,其中许多版本一个接一个地启动,每个失败都意味着整个构建失败,我们无法构建下一个版本)。

该网站不包含每个选项的版本范围,因此,除了逐个测试每个编译器版本之外,是否有更简单的方法来获取此信息?

【问题讨论】:

    标签: gcc g++ compiler-options


    【解决方案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 并列出您支持的所有编译器并为每个编译器设置标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-09-10
      • 1970-01-01
      • 2013-06-13
      • 2011-11-12
      • 1970-01-01
      • 2023-03-19
      • 2013-02-25
      相关资源
      最近更新 更多