使用uclibc时如何解决fenv.h中未定义的函数引用?
How to solve undefined reference to functions in fenv.h when using uclibc?
我正在尝试测试 fenv.h
中的某些函数,但是,当我编译以下函数时,ld 因 undefined reference to 'feclearexcept'
和 undefined reference to 'fetestexcept'
而失败。我是 运行 针对 uclibc 编译的强化 gentoo,我怀疑这至少在某种程度上是相关的
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <fenv.h>
#pragma STDC FENV_ACCESS on
int main ()
{
feclearexcept (FE_ALL_EXCEPT);
sqrt(-1);
if (fetestexcept(FE_INVALID)) printf ("sqrt(-1) raises FE_INVALID\n");
return 0;
}
fenv.h
在 /usr/include
。 /usr/lib
中有静态库和动态库(libm.a
、libm.so
)。我正在编译 gcc -o test test.c -lm
;有没有人知道为什么链接器找不到相关函数。 fenv.h
好像没有对应的库。
更新:这个十年前的博客 post 似乎暗示 uclibc 不支持 fenv。我无法确定是否仍然是这种情况,但如果是,还有什么可做的。
http://uclibc.10924.n7.nabble.com/missing-fenv-h-for-qemu-td2703.html
库最后,尝试用
编译
$ gcc -o test test.c -lm
我在我的 x86_64 Linux 系统上用上面的编译语句尝试了你的确切程序,它构建并且 运行 很好:
$ gcc -o fenv fenv.c -lm
$ ./fenv
sqrt(-1) raises FE_INVALID
我生成的二进制文件具有以下依赖项:
$ ldd ./fenv
linux-vdso.so.1 => (0x00007ffd924b7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fca457e8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca4541e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fca45af0000)
我还验证了 fenv.h
中的函数确实存在于数学库中:
emil@synapse:~/data/src$ strings /lib/x86_64-linux-gnu/libm.so.6 | grep -E ^fe
feclearexcept
fegetexceptflag
feraiseexcept
fesetexceptflag
fetestexcept
fegetround
fesetround
fegetenv
feholdexcept
fesetenv
feupdateenv
fedisableexcept
feenableexcept
fegetexcept
所以您的设置可能还有其他问题。
最近 uclib-ng 记录了对 fenv.h
缺乏支持的问题:https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/docs/uClibc_vs_SuSv3.txt?h=v1.0.29#n104
Unimplemented mathematical interfaces:
--------------------------------------
math.h: [126] many
complex.h: [46] all, except cabs
fenv.h: [11] all
我正在尝试测试 fenv.h
中的某些函数,但是,当我编译以下函数时,ld 因 undefined reference to 'feclearexcept'
和 undefined reference to 'fetestexcept'
而失败。我是 运行 针对 uclibc 编译的强化 gentoo,我怀疑这至少在某种程度上是相关的
#include <stdio.h> /* printf */
#include <math.h> /* sqrt */
#include <fenv.h>
#pragma STDC FENV_ACCESS on
int main ()
{
feclearexcept (FE_ALL_EXCEPT);
sqrt(-1);
if (fetestexcept(FE_INVALID)) printf ("sqrt(-1) raises FE_INVALID\n");
return 0;
}
fenv.h
在 /usr/include
。 /usr/lib
中有静态库和动态库(libm.a
、libm.so
)。我正在编译 gcc -o test test.c -lm
;有没有人知道为什么链接器找不到相关函数。 fenv.h
好像没有对应的库。
更新:这个十年前的博客 post 似乎暗示 uclibc 不支持 fenv。我无法确定是否仍然是这种情况,但如果是,还有什么可做的。 http://uclibc.10924.n7.nabble.com/missing-fenv-h-for-qemu-td2703.html
库最后,尝试用
编译$ gcc -o test test.c -lm
我在我的 x86_64 Linux 系统上用上面的编译语句尝试了你的确切程序,它构建并且 运行 很好:
$ gcc -o fenv fenv.c -lm
$ ./fenv
sqrt(-1) raises FE_INVALID
我生成的二进制文件具有以下依赖项:
$ ldd ./fenv
linux-vdso.so.1 => (0x00007ffd924b7000)
libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007fca457e8000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fca4541e000)
/lib64/ld-linux-x86-64.so.2 (0x00007fca45af0000)
我还验证了 fenv.h
中的函数确实存在于数学库中:
emil@synapse:~/data/src$ strings /lib/x86_64-linux-gnu/libm.so.6 | grep -E ^fe
feclearexcept
fegetexceptflag
feraiseexcept
fesetexceptflag
fetestexcept
fegetround
fesetround
fegetenv
feholdexcept
fesetenv
feupdateenv
fedisableexcept
feenableexcept
fegetexcept
所以您的设置可能还有其他问题。
最近 uclib-ng 记录了对 fenv.h
缺乏支持的问题:https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/docs/uClibc_vs_SuSv3.txt?h=v1.0.29#n104
Unimplemented mathematical interfaces:
--------------------------------------
math.h: [126] many
complex.h: [46] all, except cabs
fenv.h: [11] all