包含 math.h 和链接 libm 时的 C sinhl undefined reference

标签 c gcc math.h libm

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

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

像 sinl、cosl、tanl 这样的函数可以工作,但是只要我调用 sinhl 之类的函数,我就会收到关于内置函数的隐式声明和 undefined reference 的错误的警告。

相关标题部分:

#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

最佳答案

@Giovanni Lombardo:感谢您让我思考操作系统完全缺失的功能。非常感谢。

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

对于遇到它的任何其他人:

  • 安装/usr/ports/math/libmissing

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

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

关于包含 math.h 和链接 libm 时的 C sinhl undefined reference ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20459420/

相关文章:

c - NULL 数据指针与 NULL 函数指针相同吗?

c - 使用 valgrind 的 C 程序浮点陷阱

gcc - 汇编器模板、asmSymbolicName 和 "error: expected string-literal"

c - 在这种情况下 pow 函数如何工作?

c++ - 雕刻 1.4 CSG - C2375 : 'cbrt' : redefinition; different linkage

c++ - fmod 返回不一致的值

c - 将地址空间除以 8

objective-c - (Obj-)C 中的 BEDMAS 优先级?

c - 代码是如何执行的和gcc

c - 使用 GNU/GCC 四精度库出错