Link -ffast-math(-ffinite-math-only)和 glibc 2.31 的错误

Link errors with -ffast-math (-ffinite-math-only) and glibc 2.31

最近,glibc(即 glibc 2.31,包含在 Ubuntu 20.04 中)似乎删除了像 __exp_finite().

这样的函数族

这些函数是在使用 gcc 的选项 -ffinite-math-only(或 -ffast-math 进行编译时使用的,它启用了上述选项)。

我的问题是我编译了封闭源代码 第三方提供的静态库,这些库可能是用这个标志编译的,并且这些库生成链接错误以丢失数学函数,如 __exp_finite().

我的问题是什么是更好的解决方案?

  1. 将问题提交给第三方,要求他们从命令行中删除违规标志并等待(几个月...)?
  2. 将问题提交给 glibc 开发人员,说明他们破坏了与此构建选项的兼容性?
  3. 自己定义缺失的函数?
  4. ?

我宁愿忽略涉及在与 Ubuntu 提供的本机环境不同的环境中编译的解决方案(以及后来可能在升级 glibc 时的其他发行版)。

希望我已经正确理解了问题,我们将不胜感激。

我将以下 c++ 文件添加到我们的主项目中,定义了缺少的函数:

#include <math.h>

extern "C" {
    double __exp_finite(double x) { return exp(x); }
    double __log_finite(double x) { return log(x); }
    double __pow_finite(double x, double y) { return pow(x, y); }

    float __expf_finite(float x) { return expf(x); }
    float __logf_finite(float x) { return logf(x); }
    float __powf_finite(float x, float y) { return powf(x, y); }
}

这是迄今为止最快的解决方案。