我正在尝试测试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中。 libm.a中有静态和动态库(libm.so/usr/lib)。我正在使用gcc -o test test.c -lm进行编译;有谁知道为什么链接器找不到相关功能。 fenv.h中似乎没有任何内容具有相应的库。

更新:已有十年历史的博客文章似乎暗示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

因此,您的设置中可能还有其他问题。

10-05 19:52