快速数学导致对“__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 中的未定义行为? [复制]