使用uclibc时如何解决fenv.h中函数的未定义引用?

时间:2015-10-17 21:01:36

标签: c linux gcc uclibc floating-point-exceptions

我试图测试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/includelibm.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

2 个答案:

答案 0 :(得分:1)

图书馆排在最后,尝试使用

进行编译
$ 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

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

答案 1 :(得分:0)

最近的uclib-ng记录了select avg(loan_amt) "LOAN_AVG",age_range from( select l.loan_amount as loan_amt, (case when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) between 20 and 25 then '20-25' when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) between 30 and 35 then '30-35' when FLOOR((months_between(sysdate,to_CHAR(c.c_dob,'DD-MON-YYYY')))/12) between 40 and 45 then '40-45' else '46-90' end) as age_range from customer c,cust_loan_taken l where c.C_ID=l.C_ID) a group by age_range; https://cgit.uclibc-ng.org/cgi/cgit/uclibc-ng.git/tree/docs/uClibc_vs_SuSv3.txt?h=v1.0.29#n104

上对fenv.h的支持不足的问题
Unimplemented mathematical interfaces:
--------------------------------------
math.h: [126] many
complex.h: [46] all, except cabs
fenv.h: [11] all