为什么即使我包含math.h标题,我也会收到“对sqrt的未定义引用”错误?

时间:2012-05-02 06:53:16

标签: c linker linker-errors libm

我是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和其他三角函数得到了同样的错误。为什么呢?

6 个答案:

答案 0 :(得分:131)

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

gcc test.c -o test -lm

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

答案 1 :(得分:21)

您需要链接-lm链接器选项

您需要编译为

gcc test.c  -o test -lm
历史上,gcc(非g ++)在链接时默认不包括数学函数。它也已经从libc分离到一个单独的库libm上。要链接这些函数,您必须建议链接器包含库-l链接器选项,后跟库名m,因此-lm

答案 2 :(得分:7)

这可能是链接器错误。 添加-lm开关以指定您要链接标准C数学库(libm),该数学库具有这些函数的定义(标题只有声明他们 - 值得查看差异。)

答案 3 :(得分:4)

因为您没有告诉链接器数学库的位置。使用 gcc test.c -o test -lm

进行编译

答案 4 :(得分:2)

您必须将头文件math.h与您的代码相关联。您可以在命令后键入-lm来执行此操作。

答案 5 :(得分:1)

添加标题:

#include<math.h>

注意:使用abs(),有时在评估时,sqrt()可以采用负值,这会留下域错误。

abs() - 提供绝对值;

例如,abs(-3)= 3

在编译期间在命令末尾包含-lm:

gcc <filename.extension> -lm