7

の関数のいくつかをテストしようとしてい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.alibm.so) があり/usr/libます。私はコンパイルしていgcc -o test test.c -lmます; リンカが関連する関数を見つけられない理由は誰にもありません。fenv.h対応するライブラリがないようです。

更新: この 10 年前のブログ投稿は、fenv が uclibc でサポートされていないことを示唆しているようです。今もそうであるかどうかは判断できませんが、もしそうなら、何かすべきことがあります。 http://uclibc.10924.n7.nabble.com/missing-fenv-h-for-qemu-td2703.html

4

2 に答える 2

7

ライブラリは最後に、コンパイルしてみてください

$ 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

したがって、おそらくセットアップに何か問題があります。

于 2015-10-17T21:05:39.730 に答える