在ubuntu20.04上,当我使用clang-8或clang-9 (clang version 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.15gcc很好。你知道这是怎么回事吗?
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没有这个问题。哥德波特也很好。它一定是在系统或特定的颠覆上有问题。
到目前为止,秩序并不重要,所以我认为这不是gcc不会适当地包括数学。
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更新有关。再也没有math-finite.h了,所以当-ffast-math生成__*finite时,它就会失败。改变它的行为必须有clang。
发布于 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“注释),它们就需要停止这样做。
发布于 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
https://stackoverflow.com/questions/62334452
复制相似问题