2

誰かがこれを以前に見たことがあり、洞察を提供できることを願っています。

FreeBSD 9.2 x86_64 で gcc 4.2.1 を使用して、math.h を含めて libm をリンクしています。

sinl、cosl、tanl などの関数は機能しますが、sinhl などを呼び出すとすぐに、ビルトインの暗黙の宣言と未定義の参照のエラーに関する警告が表示されます。

関連するヘッダー セクション:

#include <math.h>
#include <stdlib.h>

// ....

long double function0(long double inValue)
{
    // Sine long double == sinl
    return sinl(inValue);
}

// ....

long double function3(long double inValue)
{
    // Hyperbolic Sine long double == sinhl
    return sinhl(inValue);
}

Makefile スタッフ:

all:
        gcc -o test test.c -lm

コンパイル試行の結果:

function_references.h: In function 'function3':
function_references.h:39: warning: incompatible implicit declaration of built-in function 'sinhl'
/tmp//ccSpynxE.o: In function `function3':
test.c:(.text+0x98): undefined reference to `sinhl'

math.h を確認したところ、sinl と sinhl の両方が同じようにリストされています。ニヤリとして、32 ビット版の libm にリンクしようとしましたが、うまくいきませんでした。

興味深いことに、/usr/include/libm.a 内のシンボルを見ると、sinl には何かが表示されますが、sinhl には何も表示されません。双曲線三角関数を使用するには、他のライブラリをリンクする必要がありますか?

私はこの 24 時間、オンとオフをつつき続けてきました。coshl、tanhl、logl、log2l、log10l、expl など、他の多くの関数でも同じ問題が発生します。

新鮮な目からのアイデアはありますか?

前もって感謝します。-T

4

1 に答える 1

1

@Giovanni Lombardo: OS から完全に欠落している機能について考えさせてくれてありがとう。とても有難い。

解決策は、不足している数学関数に対して「libmissing」をインストールすることでした。

それに遭遇した他の人のために:

  • /usr/ports/math/libmissing をインストールします

  • コードに missing_math.h の #include を追加します。

  • libmissing のパスとリンクを含めるように Makefile を更新します。
    gcc -I/usr/local/include -L/usr/local/lib -o test test.c -lm -lmissing

于 2013-12-09T18:52:08.910 に答える