2

希望有人以前见过这个并且可以提供一些见解。

我包括 math.h 和链接 libm,在 FreeBSD 9.2 x86_64 上使用 gcc 4.2.1。

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);
}

生成文件的东西:

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:感谢您让我思考操作系统中完全缺少的功能。非常感激。

解决方案是为缺少的数学函数安装“libmissing”。

对于遇到它的其他人:

  • 安装 /usr/ports/math/libmissing

  • 将 missing_math.h 的 #include 添加到您的代码中。

  • 更新 Makefile 以包含 libmissing 的路径和链接:
    gcc -I/usr/local/include -L/usr/local/lib -o test test.c -lm -lmissing

于 2013-12-09T18:52:08.910 回答