我很新的C和我有这样的代码:
#include <stdio.h>
#include <math.h>
int main(void)
{
double x = 0.5;
double result = sqrt(x);
printf("The square root of %lf is %lf\n", x, result);
return 0;
}
但是,当我编译这个用:
gcc test.c -o test
我得到这样的错误:
/tmp/cc58XvyX.o: In function `main':
test.c:(.text+0x2f): undefined reference to `sqrt'
collect2: ld returned 1 exit status
为什么会出现这种情况? 是sqrt()
不是在math.h
头文件? 我得到了同样的错误cosh
和其他三角函数。 为什么?
数学库必须在构建可执行文件时链接。 如何做到这一点的环境而异,但在的Linux / Unix,只需添加-lm
的命令:
gcc test.c -o test -lm
数学库被命名为libm.so
和-l
命令选项假定lib
前缀和.a
或.so
后缀。
你需要用链接的-lm
链接器选项
你需要为编译
gcc test.c -o test -lm
GCC(不是G ++)历史将默认不包括而链接的数学函数。 它也被从libc中分离到一个单独的库libm中。 要使用这些功能,你必须通知链接到包含链接库-l
链接器选项,后跟库名m
因而-lm
。
这是一个可能的链接错误。 添加-lm
开关来指定要对标准C数学库(链接libm
),其中有定义为这些功能(头只是对他们的声明 -值得期待补差价)
因为你没有告诉数学库的位置链接。 用gcc -o test.c的测试-lm编译
您必须链接头文件math.h
与您的代码。 您可以通过键入做到这一点-lm
您的命令后。
添加标题:
#include<math.h>
注意:使用ABS(),有时在评估的sqrt()的时候可以采取哪些留给域误差负值。
ABS() - 提供绝对值;
例如,ABS(-3)= 3
包括在你的命令在编译时结束-lm:
gcc <filename.extension> -lm
文章来源: Why am I getting “undefined reference to sqrt” error even though I include math.h header? [duplicate]