【发布时间】: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 相关:stackoverflow.com/q/8671366/10957435
-
@NateEldredge 不幸的是,事实并非如此。
-
请注意,如果是订单问题,它会说:
undefined reference to 'pow'not__pow_infinate -
我同意这看起来像是一个带有 clang 或 glibc 或 Ubuntu 20.04 组合的错误。如果这是一个可接受的替代方案,它可以与 clang-10 一起使用。
标签: c++ c clang clang++ ubuntu-20.04