首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >快速数学导致对`__pow_finite的未定义引用

快速数学导致对`__pow_finite的未定义引用
EN

Stack Overflow用户
提问于 2020-06-11 22:15:29
回答 2查看 5.2K关注 0票数 9

在ubuntu20.04上,当我使用clang-8或clang-9 (clang version 9.0.1-12)编译包含对libm的引用的简单代码时,如果出现“未定义的对__pow_finite的引用”,它将失败。

代码语言:javascript
复制
#include <math.h>

int main()
{
    double x=1, y=1;
    x = pow(x,y);
}
代码语言:javascript
复制
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++也有同样的问题:

代码语言:javascript
复制
#include <cmath>

int main()
{
    double x=1, y=1;
    x = pow(x,y);
}

编辑

实际上我用的是-lm,我只是忘了输入文本。如果我不加它,这是另一个错误。

代码语言:javascript
复制
$ 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没有这个问题。哥德波特也很好。它一定是在系统或特定的颠覆上有问题。

到目前为止,秩序并不重要,所以我认为这不是gcc不会适当地包括数学。

代码语言:javascript
复制
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的问题。

代码语言:javascript
复制
clang-9 -v -fuse-ld=/usr/lib/gcc/x86_64-linux-gnu/9/collect2 test.c -ffast-math -lm

更新

这似乎与libc更新有关。再也没有math-finite.h了,所以当-ffast-math生成__*finite时,它就会失败。改变它的行为必须有clang。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-15 22:16:27

TL;TR:这是clang中的一个bug,它在clang-10中修复.如果有同样的问题,请使用gcc或使用最新的clang版本。

造成这种情况的根本原因是clang错误地在libm中调用了一些非API函数:

它们只是一个ABI (只使用-ffinite-数学或暗示它的选项,从而导致头使用"asm“重定向到某些libm函数),而不是API。这种更改意味着ABI已经变成compat符号(只适用于现有二进制文件,不适用于新链接的任何内容,完全不包含在静态libm中,对于未来的glibc端口(如RV32)没有包含在共享libm中),因此,是的,在任何情况下,如果工具生成对这些函数的直接调用(而不只是遵循标头中函数声明的"asm“注释),它们就需要停止这样做。

Bug已经在clang-10中被跟踪这里按下修复了很长一段时间。

票数 0
EN

Stack Overflow用户

发布于 2021-03-22 03:05:18

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

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62334452

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档