为什么我会收到“未定义参考开方”的错误,即使我包括math.h中头? [重复] 为什么我会收到“

2019-05-13 18:32发布

这个问题已经在这里有一个答案:

  • 未定义参照SQRT(或其他数学函数) 4个答案

我很新的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和其他三角函数。 为什么?

Answer 1:

数学库必须在构建可执行文件时链接。 如何做到这一点的环境而异,但在的Linux / Unix,只需添加-lm的命令:

gcc test.c -o test -lm

数学库被命名为libm.so-l命令选项假定lib前缀和.a.so后缀。



Answer 2:

你需要用链接的-lm链接器选项

你需要为编译

gcc test.c  -o test -lm

GCC(不是G ++)历史将默认不包括而链接的数学函数。 它也被从libc中分离到一个单独的库libm中。 要使用这些功能,你必须通知链接到包含链接库-l链接器选项,后跟库名m因而-lm



Answer 3:

这是一个可能的链接错误。 添加-lm开关来指定要对标准C数学库(链接libm ),其中有定义为这些功能(头只是对他们的声明 -值得期待补差价)



Answer 4:

因为你没有告诉数学库的位置链接。 用gcc -o test.c的测试-lm编译



Answer 5:

您必须链接头文件math.h与您的代码。 您可以通过键入做到这一点-lm您的命令后。



Answer 6:

添加标题:

#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]