快速数学导致对“__pow_finite”的未定义引用

Posted

技术标签:

【中文标题】快速数学导致对“__pow_finite”的未定义引用【英文标题】:fast-math cause undefined reference to `__pow_finite' 【发布时间】:2020-10-01 16:35:13 【问题描述】:

在 ubuntu 20.04 上,当我使用 clang-8 或 clang-9(clang 版本 9.0.1-12)编译包含对 libm 的引用的简单代码时,它将失败并出现错误“未定义对 __pow_finite 的引用”

#include <math.h>

int main()

    double x=1, y=1;
    x = pow(x,y);

clang-9 -lm test.c -ffast-math
/usr/bin/ld: /tmp/test-9b1a45.o: in function `main':
test.c:(.text+0x2a): undefined reference to `__pow_finite'

readelf -Ws /lib/x86_64-linux-gnu/libm.so.6| grep pow_finite
   626: 000000000002ed90    65 IFUNC   GLOBAL DEFAULT   17 __pow_finite@GLIBC_2.15

gcc 没问题。知道这里有什么问题吗?

c++也有同样的问题:

#include <cmath>

int main()

    double x=1, y=1;
    x = pow(x,y);

编辑

我实际上使用了-lm,我只是忘记输入文本。如果我不添加它,那就是另一个错误。

$ clang-9 test.c
/usr/bin/ld: /tmp/test-3389a6.o: in function `main':
test.c:(.text+0x25): undefined reference to `pow'

$ gcc test.c
/usr/bin/ld: /tmp/cc21n4wb.o: in function `main':
test.c:(.text+0x39): undefined reference to `pow'

F31 没有这个问题。 godbolt 也可以。一定是系统或者特定的subversion有问题。

到目前为止顺序无所谓,所以我认为不是gcc will not properly include math.h:

clang-9 test.c -ffast-math -lm
/usr/bin/ld: /tmp/test-6dfc29.o: in function `main':
test.c:(.text+0x2a): undefined reference to `__pow_finite'

clang-9 -ffast-math test.c -lm
/usr/bin/ld: /tmp/test-6754bc.o: in function `main':
test.c:(.text+0x2a): undefined reference to `__pow_finite'

把ld改成collect2也有同样的问题,应该不是ld的问题。

clang-9 -v -fuse-ld=/usr/lib/gcc/x86_64-linux-gnu/9/collect2 test.c -ffast-math -lm

更新

似乎与libc update 有关。没有math-finite.h 了,所以当-ffast-math 生成__*finite 时它会失败。 clang 必须change its behaviour。

【问题讨论】:

我已经试过了。结果是一样的。 相关,但不是重复的(因为这个问题似乎与 GCC 相关:***.com/q/8671366/10957435 @NateEldredge 不幸的是,事实并非如此。 请注意,如果是订单问题,它会说:undefined reference to 'pow' not __pow_infinate 我同意这看起来像是一个带有 clang 或 glibc 或 Ubuntu 20.04 组合的错误。如果这是一个可接受的替代方案,它可以与 clang-10 一起使用。 【参考方案1】:

编译时添加头文件,clang -L/home/xiaokuan/lib/glibc-2.32-install/lib -I/home/xiaokuan/lib/glibc-2.32-install/include -lm -ffast-math a.c

【讨论】:

以上是关于快速数学导致对“__pow_finite”的未定义引用的主要内容,如果未能解决你的问题,请参考以下文章

Cordova + XCTest 导致“架构 i386 的未定义符号”

使用 iOS SDK 创建 NativeScript 插件会导致“架构的未定义符号”错误

何时在空实例上调用成员函数会导致 C++11 中的未定义行为? [复制]

React Native-iOS-无效的Podfile文件:nil:NilClass的未定义方法'[]'

对结构方法的未定义引用[重复]

对静态成员的未定义引用