首页 > 解决方案 > 使用 -ffast-math (-ffinite-math-only) 和 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 时的其他发行版)。

希望我已经正确理解了这个问题,并感谢任何帮助。

标签: cgccglibc

解决方案


我将以下 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); }
}

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


推荐阅读