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()
.
我的问题是什么是更好的解决方案?
- 将问题提交给第三方,要求他们从命令行中删除违规标志并等待(几个月...)?
- 将问题提交给 glibc 开发人员,说明他们破坏了与此构建选项的兼容性?
- 自己定义缺失的函数?
- ?
我宁愿忽略涉及在与 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); }
}
这是迄今为止最快的解决方案。
最近,glibc(即 glibc 2.31,包含在 Ubuntu 20.04 中)似乎删除了像 __exp_finite()
.
这些函数是在使用 gcc 的选项 -ffinite-math-only
(或 -ffast-math
进行编译时使用的,它启用了上述选项)。
我的问题是我编译了封闭源代码 第三方提供的静态库,这些库可能是用这个标志编译的,并且这些库生成链接错误以丢失数学函数,如 __exp_finite()
.
我的问题是什么是更好的解决方案?
- 将问题提交给第三方,要求他们从命令行中删除违规标志并等待(几个月...)?
- 将问题提交给 glibc 开发人员,说明他们破坏了与此构建选项的兼容性?
- 自己定义缺失的函数?
- ?
我宁愿忽略涉及在与 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); }
}
这是迄今为止最快的解决方案。