希望有人以前看过这个并且可以提供一些见解。
我在 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/